@swf2es/player-hosts 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE.third-party +759 -0
  3. package/README.md +43 -2
  4. package/dist/indexeddb.d.ts +27 -0
  5. package/dist/indexeddb.d.ts.map +1 -0
  6. package/dist/indexeddb.js +170 -0
  7. package/dist/indexeddb.js.map +1 -0
  8. package/dist/node-worker.d.ts +2 -0
  9. package/dist/node-worker.d.ts.map +1 -0
  10. package/dist/node-worker.js +12 -0
  11. package/dist/node-worker.js.map +1 -0
  12. package/dist/node.d.ts +8 -0
  13. package/dist/node.d.ts.map +1 -0
  14. package/dist/node.js +43 -0
  15. package/dist/node.js.map +1 -0
  16. package/dist/precompiled.d.ts +31 -0
  17. package/dist/precompiled.d.ts.map +1 -0
  18. package/dist/precompiled.js +125 -0
  19. package/dist/precompiled.js.map +1 -0
  20. package/dist/stage3d.d.ts +13 -0
  21. package/dist/stage3d.d.ts.map +1 -0
  22. package/dist/stage3d.js +61 -0
  23. package/dist/stage3d.js.map +1 -0
  24. package/dist/thread/codegen/codegen.js +308 -0
  25. package/dist/thread/codegen/index.js +405 -0
  26. package/dist/thread/format/abc-names.js +126 -0
  27. package/dist/thread/format/actions.js +222 -0
  28. package/dist/thread/format/air-descriptor.js +63 -0
  29. package/dist/thread/format/api-versions.js +22 -0
  30. package/dist/thread/format/bitmap.js +199 -0
  31. package/dist/thread/format/button.js +60 -0
  32. package/dist/thread/format/compression.js +200 -0
  33. package/dist/thread/format/display.js +305 -0
  34. package/dist/thread/format/filters.js +136 -0
  35. package/dist/thread/format/font.js +168 -0
  36. package/dist/thread/format/index.js +26 -0
  37. package/dist/thread/format/pbj.js +484 -0
  38. package/dist/thread/format/shape.js +411 -0
  39. package/dist/thread/format/sound.js +91 -0
  40. package/dist/thread/format/swf.js +163 -0
  41. package/dist/thread/format/tags.js +58 -0
  42. package/dist/thread/format/text.js +135 -0
  43. package/dist/thread/format/zip.js +91 -0
  44. package/dist/thread/native/audio/binary.js +3 -0
  45. package/dist/thread/native/audio/index.js +72 -0
  46. package/dist/thread/native/base64.js +9 -0
  47. package/dist/thread/native/compress/binary.js +3 -0
  48. package/dist/thread/native/compress/index.js +145 -0
  49. package/dist/thread/native/instance.js +49 -0
  50. package/dist/thread/native/mp3/binary.js +3 -0
  51. package/dist/thread/native/mp3/index.js +48 -0
  52. package/dist/thread/native/render/binary.js +3 -0
  53. package/dist/thread/native/render/bitmap-kernel.js +591 -0
  54. package/dist/thread/native/render/draw-kernel.js +204 -0
  55. package/dist/thread/native/render/dxt-encoder.js +94 -0
  56. package/dist/thread/native/render/index.js +10 -0
  57. package/dist/thread/native/render/lines.js +122 -0
  58. package/dist/thread/native/render/module.js +26 -0
  59. package/dist/thread/native/render/pixel-ops.js +235 -0
  60. package/dist/thread/native/render/tessellator.js +250 -0
  61. package/dist/thread/player/avm1/amf.js +507 -0
  62. package/dist/thread/player/avm1/avm1.js +1304 -0
  63. package/dist/thread/player/avm1/bindings.js +214 -0
  64. package/dist/thread/player/avm1/classes.js +75 -0
  65. package/dist/thread/player/avm1/clips.js +229 -0
  66. package/dist/thread/player/avm1/compile.js +140 -0
  67. package/dist/thread/player/avm1/external.js +79 -0
  68. package/dist/thread/player/avm1/focus.js +278 -0
  69. package/dist/thread/player/avm1/globals/BitmapData.js +542 -0
  70. package/dist/thread/player/avm1/globals/Button.js +31 -0
  71. package/dist/thread/player/avm1/globals/Color.js +115 -0
  72. package/dist/thread/player/avm1/globals/ExternalInterface.js +310 -0
  73. package/dist/thread/player/avm1/globals/FileReference.js +217 -0
  74. package/dist/thread/player/avm1/globals/Key.js +60 -0
  75. package/dist/thread/player/avm1/globals/LoadVars.js +208 -0
  76. package/dist/thread/player/avm1/globals/LocalConnection.js +92 -0
  77. package/dist/thread/player/avm1/globals/MovieClip.js +1070 -0
  78. package/dist/thread/player/avm1/globals/MovieClipLoader.js +90 -0
  79. package/dist/thread/player/avm1/globals/NetConnection.js +261 -0
  80. package/dist/thread/player/avm1/globals/PrintJob.js +37 -0
  81. package/dist/thread/player/avm1/globals/Selection.js +62 -0
  82. package/dist/thread/player/avm1/globals/SharedObject.js +245 -0
  83. package/dist/thread/player/avm1/globals/Sound.js +238 -0
  84. package/dist/thread/player/avm1/globals/Stage.js +12 -0
  85. package/dist/thread/player/avm1/globals/StyleSheet.js +205 -0
  86. package/dist/thread/player/avm1/globals/TextField.js +396 -0
  87. package/dist/thread/player/avm1/globals/TextFormat.js +194 -0
  88. package/dist/thread/player/avm1/globals/TextSnapshot.js +88 -0
  89. package/dist/thread/player/avm1/globals/XML.js +396 -0
  90. package/dist/thread/player/avm1/globals/XMLNode.js +413 -0
  91. package/dist/thread/player/avm1/globals/XMLSocket.js +205 -0
  92. package/dist/thread/player/avm1/globals/drawing.js +202 -0
  93. package/dist/thread/player/avm1/globals/filters.js +635 -0
  94. package/dist/thread/player/avm1/globals/geom.js +600 -0
  95. package/dist/thread/player/avm1/input.js +483 -0
  96. package/dist/thread/player/avm1/keyboard.js +113 -0
  97. package/dist/thread/player/avm1/loads.js +352 -0
  98. package/dist/thread/player/avm1/net.js +219 -0
  99. package/dist/thread/player/avm1/paths.js +104 -0
  100. package/dist/thread/player/avm1/pointer.js +512 -0
  101. package/dist/thread/player/avm1/queue.js +303 -0
  102. package/dist/thread/player/avm1/sound.js +106 -0
  103. package/dist/thread/player/avm1/swf.js +141 -0
  104. package/dist/thread/player/avm1/timers.js +113 -0
  105. package/dist/thread/player/bitmap/bitmap.js +627 -0
  106. package/dist/thread/player/bitmap/draw.js +68 -0
  107. package/dist/thread/player/bitmap/dxt.js +11 -0
  108. package/dist/thread/player/bitmap/filters.js +656 -0
  109. package/dist/thread/player/bitmap/images.js +240 -0
  110. package/dist/thread/player/bitmap/kernel.js +65 -0
  111. package/dist/thread/player/bitmap/ops.js +1239 -0
  112. package/dist/thread/player/bitmap/pixel-bender.js +911 -0
  113. package/dist/thread/player/bitmap/png.js +139 -0
  114. package/dist/thread/player/bitmap/turbulence.js +89 -0
  115. package/dist/thread/player/clock.js +182 -0
  116. package/dist/thread/player/display/bitmapobject.js +25 -0
  117. package/dist/thread/player/display/bounds.js +520 -0
  118. package/dist/thread/player/display/buttonobject.js +305 -0
  119. package/dist/thread/player/display/color.js +40 -0
  120. package/dist/thread/player/display/container.js +150 -0
  121. package/dist/thread/player/display/display.js +14 -0
  122. package/dist/thread/player/display/displayobject.js +664 -0
  123. package/dist/thread/player/display/drawing.js +613 -0
  124. package/dist/thread/player/display/filters.js +285 -0
  125. package/dist/thread/player/display/geometry.js +189 -0
  126. package/dist/thread/player/display/gradients.js +117 -0
  127. package/dist/thread/player/display/graphicsdata.js +592 -0
  128. package/dist/thread/player/display/instantiate.js +71 -0
  129. package/dist/thread/player/display/matrix3d.js +373 -0
  130. package/dist/thread/player/display/morph.js +226 -0
  131. package/dist/thread/player/display/movieclip.js +680 -0
  132. package/dist/thread/player/display/perspective.js +193 -0
  133. package/dist/thread/player/display/scale9.js +236 -0
  134. package/dist/thread/player/display/shapeobject.js +131 -0
  135. package/dist/thread/player/display/shapes.js +407 -0
  136. package/dist/thread/player/display/textobjects.js +222 -0
  137. package/dist/thread/player/display/timeline.js +471 -0
  138. package/dist/thread/player/display/value-lists.js +40 -0
  139. package/dist/thread/player/display/videoobject.js +6 -0
  140. package/dist/thread/player/display/walk.js +127 -0
  141. package/dist/thread/player/files.js +334 -0
  142. package/dist/thread/player/hosts.js +207 -0
  143. package/dist/thread/player/input/avm1.js +82 -0
  144. package/dist/thread/player/input/context-menu.js +63 -0
  145. package/dist/thread/player/input/keyboard.js +458 -0
  146. package/dist/thread/player/input/pointer.js +863 -0
  147. package/dist/thread/player/input/text-editor.js +319 -0
  148. package/dist/thread/player/input/touch.js +209 -0
  149. package/dist/thread/player/localconnection.js +90 -0
  150. package/dist/thread/player/media/audio.js +376 -0
  151. package/dist/thread/player/media/dynamic-sound.js +90 -0
  152. package/dist/thread/player/media/extract.js +135 -0
  153. package/dist/thread/player/media/mp3.js +152 -0
  154. package/dist/thread/player/media/sounds.js +507 -0
  155. package/dist/thread/player/media/streaming-audio.js +133 -0
  156. package/dist/thread/player/player.js +616 -0
  157. package/dist/thread/player/playerglobal/air/net/WebSocket.js +250 -0
  158. package/dist/thread/player/playerglobal/air-library.js +8 -0
  159. package/dist/thread/player/playerglobal/flash/accessibility/Accessibility.js +21 -0
  160. package/dist/thread/player/playerglobal/flash/crypto/generateRandomBytes.js +32 -0
  161. package/dist/thread/player/playerglobal/flash/data/EncryptedLocalStore.js +61 -0
  162. package/dist/thread/player/playerglobal/flash/desktop/Clipboard.js +173 -0
  163. package/dist/thread/player/playerglobal/flash/desktop/NativeApplication.js +179 -0
  164. package/dist/thread/player/playerglobal/flash/display/AVM1Movie.js +19 -0
  165. package/dist/thread/player/playerglobal/flash/display/Bitmap.js +58 -0
  166. package/dist/thread/player/playerglobal/flash/display/BitmapData.js +633 -0
  167. package/dist/thread/player/playerglobal/flash/display/DisplayObject.js +614 -0
  168. package/dist/thread/player/playerglobal/flash/display/DisplayObjectContainer.js +224 -0
  169. package/dist/thread/player/playerglobal/flash/display/Graphics.js +345 -0
  170. package/dist/thread/player/playerglobal/flash/display/InteractiveObject.js +87 -0
  171. package/dist/thread/player/playerglobal/flash/display/Loader.js +79 -0
  172. package/dist/thread/player/playerglobal/flash/display/LoaderInfo.js +128 -0
  173. package/dist/thread/player/playerglobal/flash/display/MovieClip.js +194 -0
  174. package/dist/thread/player/playerglobal/flash/display/NativeWindow.js +245 -0
  175. package/dist/thread/player/playerglobal/flash/display/Shader.js +26 -0
  176. package/dist/thread/player/playerglobal/flash/display/ShaderData.js +85 -0
  177. package/dist/thread/player/playerglobal/flash/display/ShaderInput.js +64 -0
  178. package/dist/thread/player/playerglobal/flash/display/ShaderJob.js +181 -0
  179. package/dist/thread/player/playerglobal/flash/display/ShaderParameter.js +23 -0
  180. package/dist/thread/player/playerglobal/flash/display/Shape.js +13 -0
  181. package/dist/thread/player/playerglobal/flash/display/SimpleButton.js +103 -0
  182. package/dist/thread/player/playerglobal/flash/display/Sprite.js +84 -0
  183. package/dist/thread/player/playerglobal/flash/display/Stage.js +231 -0
  184. package/dist/thread/player/playerglobal/flash/display/Stage3D.js +54 -0
  185. package/dist/thread/player/playerglobal/flash/display/shaders.js +228 -0
  186. package/dist/thread/player/playerglobal/flash/events/Event.js +58 -0
  187. package/dist/thread/player/playerglobal/flash/events/EventDispatcher.js +103 -0
  188. package/dist/thread/player/playerglobal/flash/events/GestureEvent.js +34 -0
  189. package/dist/thread/player/playerglobal/flash/events/HTTPStatusEvent.js +8 -0
  190. package/dist/thread/player/playerglobal/flash/events/KeyboardEvent.js +51 -0
  191. package/dist/thread/player/playerglobal/flash/events/MouseEvent.js +59 -0
  192. package/dist/thread/player/playerglobal/flash/events/PressAndTapGestureEvent.js +30 -0
  193. package/dist/thread/player/playerglobal/flash/events/TimerEvent.js +16 -0
  194. package/dist/thread/player/playerglobal/flash/events/TouchEvent.js +45 -0
  195. package/dist/thread/player/playerglobal/flash/external/ExternalInterface.js +73 -0
  196. package/dist/thread/player/playerglobal/flash/filesystem/File.js +340 -0
  197. package/dist/thread/player/playerglobal/flash/filesystem/FileStream.js +453 -0
  198. package/dist/thread/player/playerglobal/flash/filesystem/paths.js +156 -0
  199. package/dist/thread/player/playerglobal/flash/filesystem/writes.js +143 -0
  200. package/dist/thread/player/playerglobal/flash/filters/BevelFilter.js +4 -0
  201. package/dist/thread/player/playerglobal/flash/filters/BitmapFilter.js +205 -0
  202. package/dist/thread/player/playerglobal/flash/filters/BlurFilter.js +4 -0
  203. package/dist/thread/player/playerglobal/flash/filters/ColorMatrixFilter.js +11 -0
  204. package/dist/thread/player/playerglobal/flash/filters/ConvolutionFilter.js +26 -0
  205. package/dist/thread/player/playerglobal/flash/filters/DisplacementMapFilter.js +51 -0
  206. package/dist/thread/player/playerglobal/flash/filters/DropShadowFilter.js +4 -0
  207. package/dist/thread/player/playerglobal/flash/filters/GlowFilter.js +4 -0
  208. package/dist/thread/player/playerglobal/flash/filters/GradientBevelFilter.js +4 -0
  209. package/dist/thread/player/playerglobal/flash/filters/GradientGlowFilter.js +4 -0
  210. package/dist/thread/player/playerglobal/flash/filters/ShaderFilter.js +53 -0
  211. package/dist/thread/player/playerglobal/flash/geom/Matrix3D.js +361 -0
  212. package/dist/thread/player/playerglobal/flash/geom/PerspectiveProjection.js +122 -0
  213. package/dist/thread/player/playerglobal/flash/geom/Transform.js +245 -0
  214. package/dist/thread/player/playerglobal/flash/geom/Utils3D.js +85 -0
  215. package/dist/thread/player/playerglobal/flash/globalization/Collator.js +149 -0
  216. package/dist/thread/player/playerglobal/flash/globalization/CurrencyFormatter.js +272 -0
  217. package/dist/thread/player/playerglobal/flash/globalization/CurrencyParseResult.js +21 -0
  218. package/dist/thread/player/playerglobal/flash/globalization/DateTimeFormatter.js +463 -0
  219. package/dist/thread/player/playerglobal/flash/globalization/LocaleID.js +144 -0
  220. package/dist/thread/player/playerglobal/flash/globalization/NumberFormatter.js +444 -0
  221. package/dist/thread/player/playerglobal/flash/globalization/NumberParseResult.js +22 -0
  222. package/dist/thread/player/playerglobal/flash/globalization/StringTools.js +59 -0
  223. package/dist/thread/player/playerglobal/flash/globalization/locale.js +190 -0
  224. package/dist/thread/player/playerglobal/flash/media/Camera.js +89 -0
  225. package/dist/thread/player/playerglobal/flash/media/Microphone.js +126 -0
  226. package/dist/thread/player/playerglobal/flash/media/Sound.js +543 -0
  227. package/dist/thread/player/playerglobal/flash/media/SoundMixer.js +74 -0
  228. package/dist/thread/player/playerglobal/flash/media/SoundTransform.js +40 -0
  229. package/dist/thread/player/playerglobal/flash/media/Video.js +43 -0
  230. package/dist/thread/player/playerglobal/flash/net/FileFilter.js +27 -0
  231. package/dist/thread/player/playerglobal/flash/net/FileReference.js +197 -0
  232. package/dist/thread/player/playerglobal/flash/net/LocalConnection.js +167 -0
  233. package/dist/thread/player/playerglobal/flash/net/NetConnection.js +155 -0
  234. package/dist/thread/player/playerglobal/flash/net/SharedObject.js +299 -0
  235. package/dist/thread/player/playerglobal/flash/net/Socket.js +282 -0
  236. package/dist/thread/player/playerglobal/flash/net/URLRequest.js +93 -0
  237. package/dist/thread/player/playerglobal/flash/net/URLStream.js +146 -0
  238. package/dist/thread/player/playerglobal/flash/net/XMLSocket.js +14 -0
  239. package/dist/thread/player/playerglobal/flash/net/local-modern.js +142 -0
  240. package/dist/thread/player/playerglobal/flash/net/local-values.js +217 -0
  241. package/dist/thread/player/playerglobal/flash/net/navigateToURL.js +29 -0
  242. package/dist/thread/player/playerglobal/flash/profiler/Telemetry.js +25 -0
  243. package/dist/thread/player/playerglobal/flash/sensors/Accelerometer.js +12 -0
  244. package/dist/thread/player/playerglobal/flash/system/ApplicationDomain.js +69 -0
  245. package/dist/thread/player/playerglobal/flash/system/Capabilities.js +163 -0
  246. package/dist/thread/player/playerglobal/flash/system/FSCommandHost.js +17 -0
  247. package/dist/thread/player/playerglobal/flash/system/Security.js +46 -0
  248. package/dist/thread/player/playerglobal/flash/system/SecurityDomain.js +21 -0
  249. package/dist/thread/player/playerglobal/flash/system/System.js +73 -0
  250. package/dist/thread/player/playerglobal/flash/system/Worker.js +112 -0
  251. package/dist/thread/player/playerglobal/flash/text/Font.js +95 -0
  252. package/dist/thread/player/playerglobal/flash/text/StaticText.js +16 -0
  253. package/dist/thread/player/playerglobal/flash/text/StyleSheet.js +65 -0
  254. package/dist/thread/player/playerglobal/flash/text/TextField.js +707 -0
  255. package/dist/thread/player/playerglobal/flash/text/TextRenderer.js +77 -0
  256. package/dist/thread/player/playerglobal/flash/text/engine/FontDescription.js +141 -0
  257. package/dist/thread/player/playerglobal/flash/text/engine/TabStop.js +46 -0
  258. package/dist/thread/player/playerglobal/flash/trace/Trace.js +17 -0
  259. package/dist/thread/player/playerglobal/flash/ui/ContextMenu.js +17 -0
  260. package/dist/thread/player/playerglobal/flash/ui/GameInput.js +19 -0
  261. package/dist/thread/player/playerglobal/flash/ui/Keyboard.js +27 -0
  262. package/dist/thread/player/playerglobal/flash/ui/Mouse.js +127 -0
  263. package/dist/thread/player/playerglobal/flash/ui/Multitouch.js +46 -0
  264. package/dist/thread/player/playerglobal/flash/utils/ByteArray.js +155 -0
  265. package/dist/thread/player/playerglobal/flash/utils/Timer.js +25 -0
  266. package/dist/thread/player/playerglobal/flash/xml/XMLDocument.js +74 -0
  267. package/dist/thread/player/playerglobal/index.js +224 -0
  268. package/dist/thread/player/playerglobal/libraries.js +10 -0
  269. package/dist/thread/player/playerglobal/playerglobal-library.js +22 -0
  270. package/dist/thread/player/playerglobal/toplevel.js +122 -0
  271. package/dist/thread/player/scripting/clipboard.js +146 -0
  272. package/dist/thread/player/scripting/code.js +900 -0
  273. package/dist/thread/player/scripting/evaluate.js +144 -0
  274. package/dist/thread/player/scripting/events.js +172 -0
  275. package/dist/thread/player/scripting/handover.js +182 -0
  276. package/dist/thread/player/scripting/lazy.js +38 -0
  277. package/dist/thread/player/scripting/lifecycle.js +272 -0
  278. package/dist/thread/player/scripting/loads.js +860 -0
  279. package/dist/thread/player/scripting/sha256.js +95 -0
  280. package/dist/thread/player/scripting/symbols.js +348 -0
  281. package/dist/thread/player/scripting/timers.js +434 -0
  282. package/dist/thread/player/scripting/workers.js +923 -0
  283. package/dist/thread/player/scripting.js +1018 -0
  284. package/dist/thread/player/stage.js +4 -0
  285. package/dist/thread/player/text/csm.js +113 -0
  286. package/dist/thread/player/text/css.js +167 -0
  287. package/dist/thread/player/text/fonts.js +97 -0
  288. package/dist/thread/player/text/layout.js +393 -0
  289. package/dist/thread/player/text/static.js +109 -0
  290. package/dist/thread/player/text/text.js +431 -0
  291. package/dist/thread/player/workers/thread.js +159 -0
  292. package/dist/thread/player/workers/wire.js +198 -0
  293. package/dist/thread/player-hosts/web-worker.js +19 -0
  294. package/dist/thread/runtime/avm1/activation.js +89 -0
  295. package/dist/thread/runtime/avm1/case.js +249 -0
  296. package/dist/thread/runtime/avm1/clips.js +334 -0
  297. package/dist/thread/runtime/avm1/control.js +280 -0
  298. package/dist/thread/runtime/avm1/errors.js +50 -0
  299. package/dist/thread/runtime/avm1/functions.js +249 -0
  300. package/dist/thread/runtime/avm1/globals/array.js +549 -0
  301. package/dist/thread/runtime/avm1/globals/broadcaster.js +131 -0
  302. package/dist/thread/runtime/avm1/globals/date.js +436 -0
  303. package/dist/thread/runtime/avm1/globals/global.js +344 -0
  304. package/dist/thread/runtime/avm1/globals/math.js +139 -0
  305. package/dist/thread/runtime/avm1/globals/number.js +93 -0
  306. package/dist/thread/runtime/avm1/globals/string.js +201 -0
  307. package/dist/thread/runtime/avm1/globals/timers.js +129 -0
  308. package/dist/thread/runtime/avm1/host.js +5 -0
  309. package/dist/thread/runtime/avm1/index.js +14 -0
  310. package/dist/thread/runtime/avm1/inheritance.js +132 -0
  311. package/dist/thread/runtime/avm1/numbers.js +298 -0
  312. package/dist/thread/runtime/avm1/objects.js +896 -0
  313. package/dist/thread/runtime/avm1/operators.js +170 -0
  314. package/dist/thread/runtime/avm1/realm.js +529 -0
  315. package/dist/thread/runtime/avm1/runtime.js +882 -0
  316. package/dist/thread/runtime/avm1/scope.js +385 -0
  317. package/dist/thread/runtime/avm1/urls.js +180 -0
  318. package/dist/thread/runtime/avm1/values.js +97 -0
  319. package/dist/thread/runtime/avm2/amf-classes.js +66 -0
  320. package/dist/thread/runtime/avm2/amf.js +801 -0
  321. package/dist/thread/runtime/avm2/array-conversion.js +100 -0
  322. package/dist/thread/runtime/avm2/builtin-library.js +21 -0
  323. package/dist/thread/runtime/avm2/cache-fill.js +86 -0
  324. package/dist/thread/runtime/avm2/classes.js +211 -0
  325. package/dist/thread/runtime/avm2/definitions.js +69 -0
  326. package/dist/thread/runtime/avm2/descriptors.js +5 -0
  327. package/dist/thread/runtime/avm2/dictionary-keys.js +295 -0
  328. package/dist/thread/runtime/avm2/domain-memory.js +75 -0
  329. package/dist/thread/runtime/avm2/domain.js +280 -0
  330. package/dist/thread/runtime/avm2/dynamic-properties.js +182 -0
  331. package/dist/thread/runtime/avm2/enumeration.js +393 -0
  332. package/dist/thread/runtime/avm2/errors.js +45 -0
  333. package/dist/thread/runtime/avm2/float-library.js +66 -0
  334. package/dist/thread/runtime/avm2/float.js +26 -0
  335. package/dist/thread/runtime/avm2/hooks.js +19 -0
  336. package/dist/thread/runtime/avm2/index.js +38 -0
  337. package/dist/thread/runtime/avm2/messages.js +177 -0
  338. package/dist/thread/runtime/avm2/method-factories.js +95 -0
  339. package/dist/thread/runtime/avm2/modules.js +105 -0
  340. package/dist/thread/runtime/avm2/names.js +248 -0
  341. package/dist/thread/runtime/avm2/natives/aliases.js +47 -0
  342. package/dist/thread/runtime/avm2/natives/array.js +390 -0
  343. package/dist/thread/runtime/avm2/natives/bytearray.js +1227 -0
  344. package/dist/thread/runtime/avm2/natives/case.js +88 -0
  345. package/dist/thread/runtime/avm2/natives/concurrent.js +199 -0
  346. package/dist/thread/runtime/avm2/natives/date.js +581 -0
  347. package/dist/thread/runtime/avm2/natives/define.js +130 -0
  348. package/dist/thread/runtime/avm2/natives/describe.js +351 -0
  349. package/dist/thread/runtime/avm2/natives/dictionary.js +12 -0
  350. package/dist/thread/runtime/avm2/natives/float-vector.js +81 -0
  351. package/dist/thread/runtime/avm2/natives/float.js +96 -0
  352. package/dist/thread/runtime/avm2/natives/index.js +64 -0
  353. package/dist/thread/runtime/avm2/natives/json.js +514 -0
  354. package/dist/thread/runtime/avm2/natives/number.js +162 -0
  355. package/dist/thread/runtime/avm2/natives/object.js +237 -0
  356. package/dist/thread/runtime/avm2/natives/proxy.js +75 -0
  357. package/dist/thread/runtime/avm2/natives/regexp.js +485 -0
  358. package/dist/thread/runtime/avm2/natives/shell-workers.js +404 -0
  359. package/dist/thread/runtime/avm2/natives/shell.js +557 -0
  360. package/dist/thread/runtime/avm2/natives/sort.js +377 -0
  361. package/dist/thread/runtime/avm2/natives/string.js +132 -0
  362. package/dist/thread/runtime/avm2/natives/sync.js +821 -0
  363. package/dist/thread/runtime/avm2/natives/toplevel.js +139 -0
  364. package/dist/thread/runtime/avm2/natives/vector-elements.js +46 -0
  365. package/dist/thread/runtime/avm2/natives/vector.js +406 -0
  366. package/dist/thread/runtime/avm2/natives/xml/access.js +633 -0
  367. package/dist/thread/runtime/avm2/natives/xml/build.js +291 -0
  368. package/dist/thread/runtime/avm2/natives/xml/chars.js +112 -0
  369. package/dist/thread/runtime/avm2/natives/xml/escape.js +38 -0
  370. package/dist/thread/runtime/avm2/natives/xml/names.js +204 -0
  371. package/dist/thread/runtime/avm2/natives/xml/node.js +272 -0
  372. package/dist/thread/runtime/avm2/natives/xml/operators.js +69 -0
  373. package/dist/thread/runtime/avm2/natives/xml/parser.js +356 -0
  374. package/dist/thread/runtime/avm2/natives/xml/strings.js +191 -0
  375. package/dist/thread/runtime/avm2/natives/xml/values.js +122 -0
  376. package/dist/thread/runtime/avm2/natives/xml/xml.js +645 -0
  377. package/dist/thread/runtime/avm2/number-strings.js +110 -0
  378. package/dist/thread/runtime/avm2/numbers.js +558 -0
  379. package/dist/thread/runtime/avm2/options.js +16 -0
  380. package/dist/thread/runtime/avm2/player-messages.js +550 -0
  381. package/dist/thread/runtime/avm2/property-cache.js +135 -0
  382. package/dist/thread/runtime/avm2/runtime.js +2644 -0
  383. package/dist/thread/runtime/avm2/traits.js +509 -0
  384. package/dist/thread/runtime/index.js +7 -0
  385. package/dist/web-worker.d.ts +2 -0
  386. package/dist/web-worker.d.ts.map +1 -0
  387. package/dist/web-worker.js +20 -0
  388. package/dist/web-worker.js.map +1 -0
  389. package/dist/websocket.d.ts +4 -0
  390. package/dist/websocket.d.ts.map +1 -0
  391. package/dist/websocket.js +27 -0
  392. package/dist/websocket.js.map +1 -0
  393. package/dist/workers.d.ts +35 -0
  394. package/dist/workers.d.ts.map +1 -0
  395. package/dist/workers.js +171 -0
  396. package/dist/workers.js.map +1 -0
  397. package/package.json +62 -3
  398. package/src/indexeddb.ts +227 -0
  399. package/src/node-worker.ts +13 -0
  400. package/src/node.ts +49 -0
  401. package/src/precompiled.ts +166 -0
  402. package/src/stage3d.ts +76 -0
  403. package/src/web-worker.ts +24 -0
  404. package/src/websocket.ts +32 -0
  405. package/src/workers.ts +255 -0
@@ -0,0 +1,543 @@
1
+ import { avm2 } from "../../../../runtime/index.js";
2
+ import { startDynamicSound } from "../../../media/dynamic-sound.js";
3
+ import { EXTRACT_RATE, embeddedSource, extractSamples, mp3Source, toExtractRate, } from "../../../media/extract.js";
4
+ import { mp3Frames } from "../../../media/mp3.js";
5
+ import { channels, liveSounds, MAX_SOUNDS, mixerMix, mixerMixes, mixOf, outputMix, positionOf, stopChannel, updateTimelineMixes, } from "../../../media/sounds.js";
6
+ import { dispatchEvent } from "../../../scripting/events.js";
7
+ /** An uncompressed or ADPCM DefineSound's samples, decoded once for extract; null for another format. */
8
+ const embeddedSources = new WeakMap();
9
+ /**
10
+ * MP3 samples shared by instances of an embedded sound, or kept by the
11
+ * sound they were loaded into. A first extract decodes them synchronously.
12
+ */
13
+ const mp3Decodes = new WeakMap();
14
+ /** 44.1 kHz samples as an uncompressed 16-bit DefineSound, for the host to play. */
15
+ function pcmSound(channels) {
16
+ const frames = channels[0].length;
17
+ const data = new Uint8Array(frames * channels.length * 2);
18
+ const view = new DataView(data.buffer);
19
+ for (let i = 0; i < frames; i++) {
20
+ for (const [c, channel] of channels.entries()) {
21
+ const v = Math.max(-1, Math.min(1, channel[i]));
22
+ view.setInt16((i * channels.length + c) * 2, Math.round(v * 32767), true);
23
+ }
24
+ }
25
+ return {
26
+ id: 0,
27
+ format: 3,
28
+ sampleRate: EXTRACT_RATE,
29
+ sampleSize: 16,
30
+ channels: channels.length === 1 ? 1 : 2,
31
+ sampleCount: frames,
32
+ seekSamples: 0,
33
+ data,
34
+ };
35
+ }
36
+ function stateOf(o) {
37
+ if (o.$sound) {
38
+ return o.$sound;
39
+ }
40
+ const state = {
41
+ character: null,
42
+ bytes: null,
43
+ url: null,
44
+ loaded: 0,
45
+ total: 0,
46
+ length: 0,
47
+ used: false,
48
+ generation: 0,
49
+ abort: null,
50
+ clip: null,
51
+ frames: null,
52
+ compressed: false,
53
+ pcm: null,
54
+ extracted: 0,
55
+ };
56
+ o.$sound = state;
57
+ return state;
58
+ }
59
+ /** The mixer stores channel coefficients in hundredths when a transform is assigned. */
60
+ export function channelMix(mix) {
61
+ // Whole percents, as Ruffle's i32: NaN is 0 and the range saturates.
62
+ const hundredths = (value) => Number.isNaN(value)
63
+ ? 0
64
+ : Math.max(-(2 ** 31), Math.min(2 ** 31 - 1, Math.trunc(value * 100))) / 100;
65
+ return {
66
+ volume: hundredths(mix.volume),
67
+ leftToLeft: hundredths(mix.leftToLeft),
68
+ leftToRight: hundredths(mix.leftToRight),
69
+ rightToLeft: hundredths(mix.rightToLeft),
70
+ rightToRight: hundredths(mix.rightToRight),
71
+ };
72
+ }
73
+ /** SoundMixer.soundTransform: a copy, as Flash returns. */
74
+ export function mixerTransform(s) {
75
+ return transformOf(s, mixerMix(s));
76
+ }
77
+ /** Set SoundMixer's transform, for the channels playing and those to come. */
78
+ export function setMixerTransform(s, transform) {
79
+ if (transform === null || transform === undefined) {
80
+ throw s.rt.error("TypeError", 2007, "sndTransform");
81
+ }
82
+ const global = channelMix(mixOf(transform));
83
+ mixerMixes.set(s, global);
84
+ for (const channel of channels.get(s) ?? []) {
85
+ const state = channel.$channel;
86
+ state.playing?.setMix(outputMix(state.mix, global));
87
+ }
88
+ updateTimelineMixes(s);
89
+ }
90
+ export function transformOf(s, mix) {
91
+ const o = s.rt.construct(s.rt.classNamed("flash.media::SoundTransform"));
92
+ o.$soundVolume = mix.volume;
93
+ o.$soundLeftToLeft = mix.leftToLeft;
94
+ o.$soundLeftToRight = mix.leftToRight;
95
+ o.$soundRightToLeft = mix.rightToLeft;
96
+ o.$soundRightToRight = mix.rightToRight;
97
+ return o;
98
+ }
99
+ export function soundNatives(s) {
100
+ const natives = {};
101
+ const discardPending = (sound) => {
102
+ const active = channels.get(s);
103
+ for (const channel of active ?? []) {
104
+ const state = channel.$channel;
105
+ if (state.sound === sound && !state.playing) {
106
+ stopChannel(s, state);
107
+ active?.delete(channel);
108
+ }
109
+ }
110
+ };
111
+ const discardChannel = (state) => {
112
+ stopChannel(s, state);
113
+ const active = channels.get(s);
114
+ for (const channel of active ?? []) {
115
+ if (channel.$channel === state) {
116
+ active?.delete(channel);
117
+ break;
118
+ }
119
+ }
120
+ };
121
+ const startAudio = (state) => {
122
+ const sound = state.sound;
123
+ if (!sound.character && !sound.clip) {
124
+ sound.clip = loadedClip(sound);
125
+ }
126
+ const task = sound.character ? s.symbols.soundClip(sound.character) : sound.clip;
127
+ void task
128
+ ?.then((clip) => {
129
+ if (!state.stopped) {
130
+ state.playing = clip.play(state.start, state.loops, outputMix(state.mix, mixerMix(s)));
131
+ }
132
+ }, () => {
133
+ if (!sound.character) {
134
+ discardChannel(state);
135
+ }
136
+ })
137
+ .catch(() => {
138
+ if (!sound.character) {
139
+ discardChannel(state);
140
+ }
141
+ });
142
+ };
143
+ /** The decode a sound loaded from a ByteArray plays, made when it first plays. */
144
+ const loadedClip = (sound) => {
145
+ if (!s.audio) {
146
+ return null;
147
+ }
148
+ if (sound.pcm) {
149
+ return s.audio.decode(pcmSound(sound.pcm));
150
+ }
151
+ return sound.compressed && sound.bytes ? s.audio.decode(sound.bytes) : null;
152
+ };
153
+ /** Decode only sounds a script extracts; normal playback stays on the host's decoder. */
154
+ const extractSource = (sound) => {
155
+ if (sound.pcm) {
156
+ return { rate: EXTRACT_RATE, channels: sound.pcm, skip: 0, whole: false };
157
+ }
158
+ const character = sound.character;
159
+ const definition = character?.definition;
160
+ if (character && definition && definition.format !== 2) {
161
+ let source = embeddedSources.get(character);
162
+ if (source === undefined) {
163
+ source = embeddedSource(definition);
164
+ embeddedSources.set(character, source);
165
+ }
166
+ return source;
167
+ }
168
+ const key = character ?? sound;
169
+ const bytes = definition ? definition.data : sound.bytes;
170
+ let source = mp3Decodes.get(key);
171
+ if (source === undefined && bytes?.length) {
172
+ source = mp3Source(bytes);
173
+ if (source && definition) {
174
+ source.skip = Math.max(0, definition.seekSamples);
175
+ }
176
+ mp3Decodes.set(key, source);
177
+ }
178
+ return source ?? null;
179
+ };
180
+ class SoundNatives {
181
+ /**
182
+ * Up to `length` samples at 44.1 kHz into `target` at its position, a
183
+ * float each for left and right in its byte order, from `startPosition`
184
+ * or, for -1, from where the last extract stopped.
185
+ */
186
+ extract(target, length, startPosition = -1) {
187
+ const sound = stateOf(this);
188
+ if (target === null || target === undefined) {
189
+ return 0;
190
+ }
191
+ const source = extractSource(sound);
192
+ const start = s.rt.toNumber(startPosition);
193
+ if (start >= 0) {
194
+ // Past 32 bits a start is from the beginning, as in adl.
195
+ const at = start >= 2 ** 31 ? 0 : Math.floor(start);
196
+ sound.extracted = source?.seek ? source.seek(at) : at;
197
+ if (source && sound.extracted >= (source.starts ?? Number.POSITIVE_INFINITY)) {
198
+ sound.extracted = source.channels[0].length;
199
+ return 0;
200
+ }
201
+ }
202
+ if (!source) {
203
+ return 0;
204
+ }
205
+ const { samples, position, count } = extractSamples(source, sound.extracted, s.rt.toNumber(length));
206
+ sound.extracted = position;
207
+ const b = avm2.bytesOf(s.rt, target);
208
+ const bytes = new Uint8Array(samples.length * 4);
209
+ const view = new DataView(bytes.buffer);
210
+ for (let i = 0; i < samples.length; i++) {
211
+ view.setFloat32(i * 4, samples[i], b.littleEndian);
212
+ }
213
+ if (bytes.length) {
214
+ b.write(bytes);
215
+ }
216
+ return count;
217
+ }
218
+ /**
219
+ * MP3 frames from `bytes`, added to any it was given before, as adl
220
+ * has it: its length counts a frame cut short, its decode does not,
221
+ * and a sound of the SWF's keeps its own samples.
222
+ */
223
+ loadCompressedDataFromByteArray(bytes, bytesLength) {
224
+ if (bytes === null || bytes === undefined) {
225
+ throw s.rt.error("TypeError", 2007, "bytes");
226
+ }
227
+ const sound = stateOf(this);
228
+ const b = avm2.bytesOf(s.rt, bytes);
229
+ const n = s.rt.toUint(bytesLength);
230
+ if (n === 0 || n > b.length - b.position) {
231
+ throw s.rt.error("ArgumentError", 2084);
232
+ }
233
+ const data = b.readView(n);
234
+ if (sound.character) {
235
+ return;
236
+ }
237
+ // Into room kept past the bytes before, which doubles as they grow,
238
+ // their frames read on from where they stopped: chunk by chunk, it
239
+ // all takes time in step with its bytes. Its decodes wait till it
240
+ // plays or a script extracts it.
241
+ const had = sound.compressed ? sound.bytes : null;
242
+ const size = (had?.length ?? 0) + n;
243
+ let buffer = had && had.byteOffset === 0 && had.buffer.byteLength >= size
244
+ ? new Uint8Array(had.buffer)
245
+ : null;
246
+ if (!buffer) {
247
+ buffer = new Uint8Array(Math.max(size, (had?.length ?? 0) * 2));
248
+ buffer.set(had ?? []);
249
+ }
250
+ buffer.set(data, had?.length ?? 0);
251
+ const all = buffer.subarray(0, size);
252
+ const mp3 = mp3Frames(all, had ? sound.frames : null);
253
+ sound.bytes = all;
254
+ sound.frames = mp3;
255
+ sound.compressed = true;
256
+ sound.pcm = null;
257
+ sound.used = true;
258
+ sound.loaded = n;
259
+ sound.total = n;
260
+ sound.length = mp3 ? (mp3.frames * mp3.samplesPerFrame * 1000) / mp3.rate : 0;
261
+ sound.clip = null;
262
+ mp3Decodes.delete(sound);
263
+ dispatchEvent(s, this, s.rt.construct(s.rt.classNamed("flash.events::ProgressEvent"), "progress", false, false, n, n));
264
+ }
265
+ /**
266
+ * `samples` samples of 32-bit floats or 16-bit integers from `bytes`,
267
+ * in its byte order, brought to 44.1 kHz: they take the place of
268
+ * whatever the sound had, a SWF's sound too.
269
+ */
270
+ loadPCMFromByteArray(bytes, samples, format = "float", stereo = true, sampleRate = EXTRACT_RATE) {
271
+ if (bytes === null || bytes === undefined) {
272
+ throw s.rt.error("TypeError", 2007, "bytes");
273
+ }
274
+ if (format === null || format === undefined) {
275
+ throw s.rt.error("TypeError", 2007, "format");
276
+ }
277
+ const kind = s.rt.toString(format);
278
+ if (kind !== "float" && kind !== "short") {
279
+ throw s.rt.error("ArgumentError", 2005);
280
+ }
281
+ const b = avm2.bytesOf(s.rt, bytes);
282
+ const n = s.rt.toUint(samples);
283
+ const rate = s.rt.toNumber(sampleRate);
284
+ const channels = stereo ? 2 : 1;
285
+ const size = kind === "float" ? 4 : 2;
286
+ const available = b.length - b.position;
287
+ // adl weighs the samples against the bytes, not the bytes they take,
288
+ // and then reads what there is before it finds them short.
289
+ if (n === 0 || !(rate > 0) || n > available) {
290
+ throw s.rt.error("ArgumentError", 2084);
291
+ }
292
+ // Faster than 44.1 kHz, it reads only as many as it gives out.
293
+ const outputs = Math.floor((n * EXTRACT_RATE) / rate);
294
+ const count = Math.min(n, outputs);
295
+ if (count * channels * size > available) {
296
+ b.position = (b.position + Math.floor(available / size) * size) >>> 0;
297
+ throw s.rt.error("flash.errors::EOFError", 2030);
298
+ }
299
+ const little = b.littleEndian;
300
+ const view = new DataView(b.read(count * channels * size).buffer);
301
+ const raw = Array.from({ length: channels }, () => new Float32Array(count));
302
+ for (let i = 0; i < count * channels; i++) {
303
+ raw[i % channels][Math.floor(i / channels)] =
304
+ size === 4 ? view.getFloat32(i * 4, little) : view.getInt16(i * 2, little) / 32768;
305
+ }
306
+ const sound = stateOf(this);
307
+ const pcm = toExtractRate(raw, count < n ? EXTRACT_RATE : rate);
308
+ sound.character = null;
309
+ sound.pcm = pcm;
310
+ sound.bytes = new Uint8Array(0);
311
+ sound.compressed = false;
312
+ sound.used = true;
313
+ sound.loaded = n * size;
314
+ sound.total = n * size;
315
+ // In samples a millisecond, to adl's last bit.
316
+ sound.length = pcm[0].length / (EXTRACT_RATE / 1000);
317
+ sound.extracted = 0;
318
+ sound.clip = null;
319
+ }
320
+ "flash.media:Sound::_load"(request, _checkPolicyFile, _bufferTime) {
321
+ // Sound's AS3 constructor always calls load, with null when it was given no request.
322
+ if (request === null || request === undefined) {
323
+ return;
324
+ }
325
+ const sound = stateOf(this);
326
+ if (sound.used) {
327
+ throw s.rt.error("Error", 2037);
328
+ }
329
+ sound.used = true;
330
+ const generation = ++sound.generation;
331
+ const abort = new AbortController();
332
+ sound.abort = abort;
333
+ s.loads.requestBytes(request, abort.signal, ({ bytes, local }, url) => {
334
+ if (sound.generation !== generation) {
335
+ return;
336
+ }
337
+ sound.abort = null;
338
+ sound.url = url;
339
+ if (!bytes) {
340
+ discardPending(sound);
341
+ dispatchEvent(s, this, s.rt.construct(s.rt.classNamed("flash.events::IOErrorEvent"), "ioError", false, false, s.loads.streamError(url, local)));
342
+ return;
343
+ }
344
+ sound.bytes = bytes;
345
+ sound.loaded = bytes.length;
346
+ sound.total = bytes.length;
347
+ dispatchEvent(s, this, s.event("open"));
348
+ if (sound.generation !== generation) {
349
+ return;
350
+ }
351
+ dispatchEvent(s, this, s.rt.construct(s.rt.classNamed("flash.events::ProgressEvent"), "progress", false, false, bytes.length, bytes.length));
352
+ if (sound.generation !== generation) {
353
+ return;
354
+ }
355
+ if (!s.audio) {
356
+ discardPending(sound);
357
+ dispatchEvent(s, this, s.event("complete"));
358
+ return;
359
+ }
360
+ sound.clip = s.audio.decode(bytes);
361
+ for (const channel of channels.get(s) ?? []) {
362
+ const state = channel.$channel;
363
+ if (state.sound === sound && !state.stopped) {
364
+ startAudio(state);
365
+ }
366
+ }
367
+ const completed = sound.clip.then((clip) => {
368
+ sound.length = clip.durationMs;
369
+ s.loads.deferHostEvent(() => {
370
+ if (sound.generation === generation) {
371
+ dispatchEvent(s, this, s.event("complete"));
372
+ }
373
+ });
374
+ }, () => {
375
+ discardPending(sound);
376
+ s.loads.deferHostEvent(() => {
377
+ if (sound.generation === generation) {
378
+ dispatchEvent(s, this, s.rt.construct(s.rt.classNamed("flash.events::IOErrorEvent"), "ioError", false, false, s.loads.streamError(url, local)));
379
+ }
380
+ });
381
+ });
382
+ s.loads.trackRequest(completed);
383
+ }, "content");
384
+ }
385
+ get url() {
386
+ return stateOf(this).url;
387
+ }
388
+ get isURLInaccessible() {
389
+ return false;
390
+ }
391
+ get length() {
392
+ return stateOf(this).length;
393
+ }
394
+ get isBuffering() {
395
+ return false;
396
+ }
397
+ get bytesLoaded() {
398
+ return stateOf(this).loaded;
399
+ }
400
+ get bytesTotal() {
401
+ return stateOf(this).total;
402
+ }
403
+ get id3() {
404
+ return null;
405
+ }
406
+ close() {
407
+ const sound = stateOf(this);
408
+ sound.abort?.abort();
409
+ sound.abort = null;
410
+ sound.generation++;
411
+ discardPending(sound);
412
+ }
413
+ play(startTime, loops, transform) {
414
+ const sound = stateOf(this);
415
+ const dynamic = !sound.character &&
416
+ !sound.bytes &&
417
+ !sound.abort &&
418
+ (this.$listeners?.get("sampleData")?.length ?? 0) > 0;
419
+ if (!dynamic && !sound.character && !sound.bytes && !sound.abort) {
420
+ return null;
421
+ }
422
+ const start = Math.max(0, s.rt.toNumber(startTime) || 0);
423
+ if (sound.length > 0 && start >= sound.length) {
424
+ return null;
425
+ }
426
+ // Past Flash's 32 channels play gives none, as Ruffle's start_sound does.
427
+ if (liveSounds(s) >= MAX_SOUNDS) {
428
+ return null;
429
+ }
430
+ const channel = s.rt.construct(s.rt.classNamed("flash.media::SoundChannel"));
431
+ const state = {
432
+ sound,
433
+ started: s.timers.now,
434
+ start,
435
+ loops: Math.max(0, s.rt.toInt(loops)),
436
+ mix: channelMix(mixOf(transform)),
437
+ playing: null,
438
+ stopped: false,
439
+ stoppedAt: 0,
440
+ };
441
+ channel.$channel = state;
442
+ let active = channels.get(s);
443
+ if (!active) {
444
+ active = new Set();
445
+ channels.set(s, active);
446
+ }
447
+ active.add(channel);
448
+ if (dynamic) {
449
+ const failed = () => {
450
+ active.delete(channel);
451
+ try {
452
+ state.stoppedAt = positionOf(s, state);
453
+ }
454
+ catch {
455
+ state.stoppedAt = state.start;
456
+ }
457
+ state.stopped = true;
458
+ try {
459
+ state.playing?.stop();
460
+ }
461
+ catch {
462
+ // A failing device's stop must not mask the original failure or retain the channel.
463
+ }
464
+ };
465
+ try {
466
+ startDynamicSound(s, this, state, (error) => {
467
+ failed();
468
+ s.reportUncaught(error);
469
+ });
470
+ }
471
+ catch (error) {
472
+ failed();
473
+ throw error;
474
+ }
475
+ }
476
+ else {
477
+ startAudio(state);
478
+ }
479
+ return channel;
480
+ }
481
+ }
482
+ class SoundChannelNatives {
483
+ get position() {
484
+ const state = this.$channel;
485
+ return state ? positionOf(s, state) : 0;
486
+ }
487
+ get soundTransform() {
488
+ return transformOf(s, this.$channel?.mix ?? mixOf(null));
489
+ }
490
+ set soundTransform(value) {
491
+ const state = this.$channel;
492
+ if (state) {
493
+ state.mix = channelMix(mixOf(value));
494
+ state.playing?.setMix(outputMix(state.mix, mixerMix(s)));
495
+ }
496
+ }
497
+ get leftPeak() {
498
+ return 0;
499
+ }
500
+ get rightPeak() {
501
+ return 0;
502
+ }
503
+ stop() {
504
+ const state = this.$channel;
505
+ if (state && !state.stopped) {
506
+ stopChannel(s, state);
507
+ channels.get(s)?.delete(this);
508
+ }
509
+ }
510
+ }
511
+ avm2.registerNativeClass(natives, "flash.media::Sound", SoundNatives);
512
+ avm2.registerNativeClass(natives, "flash.media::SoundChannel", SoundChannelNatives);
513
+ return natives;
514
+ }
515
+ export function soundHooks(s) {
516
+ return {
517
+ "flash.media::Sound": {
518
+ create: (traits) => {
519
+ const o = Object.create(traits.proto);
520
+ const character = s.symbols.soundSymbol(traits);
521
+ const data = character?.definition;
522
+ o.$sound = {
523
+ character,
524
+ bytes: null,
525
+ url: null,
526
+ loaded: data?.data.length ?? 0,
527
+ total: data?.data.length ?? 0,
528
+ // In samples a millisecond, to adl's last bit.
529
+ length: data ? data.sampleCount / (data.sampleRate / 1000) : 0,
530
+ used: !!data,
531
+ generation: 0,
532
+ abort: null,
533
+ clip: null,
534
+ frames: null,
535
+ compressed: false,
536
+ pcm: null,
537
+ extracted: 0,
538
+ };
539
+ return o;
540
+ },
541
+ },
542
+ };
543
+ }
@@ -0,0 +1,74 @@
1
+ // flash.media.SoundMixer: the global sound transform over every channel,
2
+ // stopAll, and the settings Flash keeps without the player using them.
3
+ import { avm2 } from "../../../../runtime/index.js";
4
+ import { stopAllSounds } from "../../../media/sounds.js";
5
+ import { mixerTransform, setMixerTransform } from "./Sound.js";
6
+ const PLAYBACK_MODES = ["media", "voice", "ambient"];
7
+ /** The 512 floats computeSpectrum writes, 256 a channel. */
8
+ const SPECTRUM_BYTES = 2048;
9
+ export function soundMixerNatives(s) {
10
+ const natives = {};
11
+ // Seconds a timeline stream buffers: Flash's default, kept and read back.
12
+ let bufferTime = 5;
13
+ let playbackMode = "media";
14
+ let speakerphone = false;
15
+ class SoundMixerNatives {
16
+ static get soundTransform() {
17
+ return mixerTransform(s);
18
+ }
19
+ static set soundTransform(value) {
20
+ setMixerTransform(s, value);
21
+ }
22
+ static get bufferTime() {
23
+ return bufferTime;
24
+ }
25
+ static set bufferTime(value) {
26
+ const time = s.rt.toInt(value);
27
+ if (time < 0) {
28
+ throw s.rt.error("RangeError", 2027, "bufferTime", time);
29
+ }
30
+ bufferTime = time;
31
+ }
32
+ static stopAll() {
33
+ stopAllSounds(s);
34
+ }
35
+ static areSoundsInaccessible() {
36
+ return false;
37
+ }
38
+ /**
39
+ * Ruffle's computeSpectrum of a device with no sample history: the
40
+ * player has no output to read back, so every value is 0.
41
+ */
42
+ static computeSpectrum(outputArray, _fftMode, _stretchFactor) {
43
+ if (outputArray === null || outputArray === undefined) {
44
+ throw s.rt.error("TypeError", 2007, "sound");
45
+ }
46
+ const bytes = outputArray.$bytes;
47
+ bytes.setLength(SPECTRUM_BYTES);
48
+ bytes.position = 0;
49
+ bytes.write(new Uint8Array(SPECTRUM_BYTES));
50
+ bytes.position = 0;
51
+ }
52
+ static get audioPlaybackMode() {
53
+ return playbackMode;
54
+ }
55
+ static set audioPlaybackMode(value) {
56
+ if (value === null || value === undefined) {
57
+ throw s.rt.error("TypeError", 2007, "audioPlaybackMode");
58
+ }
59
+ const mode = s.rt.toString(value);
60
+ if (!PLAYBACK_MODES.includes(mode)) {
61
+ throw s.rt.error("ArgumentError", 2004);
62
+ }
63
+ playbackMode = mode;
64
+ }
65
+ static get useSpeakerphoneForVoice() {
66
+ return speakerphone;
67
+ }
68
+ static set useSpeakerphoneForVoice(value) {
69
+ speakerphone = !!value;
70
+ }
71
+ }
72
+ avm2.registerNativeClass(natives, "flash.media::SoundMixer", SoundMixerNatives);
73
+ return natives;
74
+ }
@@ -0,0 +1,40 @@
1
+ // The sound mix held by a SoundTransform; playerglobal implements pan in AS3
2
+ // in terms of these four channels, and its constructor writes volume and pan.
3
+ import { avm2 } from "../../../../runtime/index.js";
4
+ export function soundTransformNatives(s) {
5
+ const natives = {};
6
+ class SoundTransformNatives {
7
+ get volume() {
8
+ return this.$soundVolume ?? 1;
9
+ }
10
+ set volume(value) {
11
+ this.$soundVolume = s.rt.toNumber(value);
12
+ }
13
+ get leftToLeft() {
14
+ return this.$soundLeftToLeft ?? 1;
15
+ }
16
+ set leftToLeft(value) {
17
+ this.$soundLeftToLeft = s.rt.toNumber(value);
18
+ }
19
+ get leftToRight() {
20
+ return this.$soundLeftToRight ?? 0;
21
+ }
22
+ set leftToRight(value) {
23
+ this.$soundLeftToRight = s.rt.toNumber(value);
24
+ }
25
+ get rightToRight() {
26
+ return this.$soundRightToRight ?? 1;
27
+ }
28
+ set rightToRight(value) {
29
+ this.$soundRightToRight = s.rt.toNumber(value);
30
+ }
31
+ get rightToLeft() {
32
+ return this.$soundRightToLeft ?? 0;
33
+ }
34
+ set rightToLeft(value) {
35
+ this.$soundRightToLeft = s.rt.toNumber(value);
36
+ }
37
+ }
38
+ avm2.registerNativeClass(natives, "flash.media::SoundTransform", SoundTransformNatives);
39
+ return natives;
40
+ }
@@ -0,0 +1,43 @@
1
+ // flash.media.Video: a box of its size on the display list, as Flash makes
2
+ // it; no stream or camera plays in it, the player having neither.
3
+ import { avm2 } from "../../../../runtime/index.js";
4
+ export function videoNatives(s) {
5
+ const natives = {};
6
+ class VideoNatives {
7
+ /** Ints, as the constructor takes them: a negative one is RangeError 2006, a 0 either way the default 320 by 240. */
8
+ "flash.media:Video::ctor"(width, height) {
9
+ const w = s.rt.toInt(width);
10
+ const h = s.rt.toInt(height);
11
+ if (w < 0 || h < 0) {
12
+ throw s.rt.error("RangeError", 2006);
13
+ }
14
+ if (w > 0 && h > 0) {
15
+ this.$display.boxWidth = w;
16
+ this.$display.boxHeight = h;
17
+ }
18
+ }
19
+ get videoWidth() {
20
+ return 0;
21
+ }
22
+ get videoHeight() {
23
+ return 0;
24
+ }
25
+ get deblocking() {
26
+ return this.$deblocking ?? 0;
27
+ }
28
+ set deblocking(v) {
29
+ this.$deblocking = s.rt.toInt(v);
30
+ }
31
+ get smoothing() {
32
+ return this.$smoothing ?? false;
33
+ }
34
+ set smoothing(v) {
35
+ this.$smoothing = !!v;
36
+ }
37
+ attachNetStream(_stream) { }
38
+ attachCamera(_camera) { }
39
+ clear() { }
40
+ }
41
+ avm2.registerNativeClass(natives, "flash.media::Video", VideoNatives);
42
+ return natives;
43
+ }