@swf2es/player-hosts 0.0.0-stage → 0.1.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 (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,303 @@
1
+ // The AVM1 action queue: what a frame, an event or a script queues, run by
2
+ // priority, the most urgent first, as Ruffle's
3
+ // (https://github.com/ruffle-rs/ruffle) ActionQueue has it (MIT OR
4
+ // Apache-2.0, Copyright (c) 2018-2022 Ruffle LLC and Ruffle contributors),
5
+ // and the blocks each queued action runs (docs/avm1.md, "The frame").
6
+ import { avm1 } from "../../runtime/index.js";
7
+ import { ClipNative, nativeOf } from "./globals/MovieClip.js";
8
+ // The queue's priorities, which it runs in order: initialize clip events
9
+ // first, then the root's DoInitAction blocks, then constructions, then the
10
+ // rest, frame actions, events and methods, each in the order queued
11
+ // (Ruffle's ActionPriority; adl has a frame's initialize events before its
12
+ // DoInitAction blocks, which Ruffle runs as the SWF loads).
13
+ export const INITIALIZE = 0;
14
+ export const INIT = 1;
15
+ export const CONSTRUCT = 2;
16
+ export const NORMAL = 3;
17
+ // What a queued action is.
18
+ /** A DoAction tag's blocks, `index` the tag's body's offset. */
19
+ export const FRAME = 0;
20
+ /** A block alone, a DoInitAction's or a clip event's, by its index. */
21
+ export const BLOCK = 1;
22
+ /** A timeline's clip's construction: its registered class's prototype and constructor, and its construct events. */
23
+ export const CONSTRUCTION = 2;
24
+ /** An AS2 event method, `name`, of the clip's object. */
25
+ export const METHOD = 3;
26
+ /** The SWF stopped, at a place whose clip actions Flash cannot read. */
27
+ export const HALT = 4;
28
+ /** A broadcaster's message, `name`, to its listeners: Key's and Mouse's, as the player sends them. */
29
+ export const NOTIFY = 5;
30
+ /** A method, `name`, of `object`, called with `args`, as a script would call it. */
31
+ export const CALL = 6;
32
+ /** An action waiting its turn in the frame. */
33
+ export class Queued {
34
+ kind;
35
+ clip;
36
+ swf;
37
+ index;
38
+ entry;
39
+ unload;
40
+ name;
41
+ blocks;
42
+ object;
43
+ args;
44
+ constructor(kind, clip,
45
+ /** The SWF whose blocks `index` and `blocks` are. */
46
+ swf = null, index = 0,
47
+ /** Which of the clip's frame entries queued a FRAME: blocks of one share their constant pool. */
48
+ entry = 0,
49
+ /** Whether it is an unload's, which runs for a clip removed since. */
50
+ unload = false, name = "", blocks = NO_BLOCKS,
51
+ /** A NOTIFY's broadcaster or a CALL's object, and the arguments. */
52
+ object = null, args = NO_ARGS) {
53
+ this.kind = kind;
54
+ this.clip = clip;
55
+ this.swf = swf;
56
+ this.index = index;
57
+ this.entry = entry;
58
+ this.unload = unload;
59
+ this.name = name;
60
+ this.blocks = blocks;
61
+ this.object = object;
62
+ this.args = args;
63
+ }
64
+ }
65
+ export const NO_BLOCKS = [];
66
+ /** How many queued actions of a priority run before those run are dropped from its queue. */
67
+ const COMPACT_AT = 4096;
68
+ export const NO_ARGS = [];
69
+ /** The queue a movie's actions wait in, by priority, and what runs them. */
70
+ export class ActionQueue {
71
+ movie;
72
+ /** The queue, by priority, and how far each has run. */
73
+ queues = [[], [], [], []];
74
+ heads = [0, 0, 0, 0];
75
+ /** Whether the queue is running, which a function's return runs the earlier passes of. */
76
+ running = false;
77
+ /** The pass of the action the queue runs, and the pass `next` last took from. */
78
+ priority = NORMAL;
79
+ taken = NORMAL;
80
+ constructor(movie) {
81
+ this.movie = movie;
82
+ }
83
+ enqueue(priority, q) {
84
+ this.queues[priority].push(q);
85
+ }
86
+ /** The next action of priorities `from` to `to`, the most urgent first; null for none. */
87
+ next(from = INITIALIZE, to = NORMAL) {
88
+ for (let p = from; p <= to; p++) {
89
+ const queue = this.queues[p];
90
+ // Gotos that go back and forth queue each other's frames for as long
91
+ // as they run, which is forever in a SWF that never stops them: what
92
+ // has run goes, and so do the clips they removed, so that such a SWF
93
+ // runs into the script timeout without its memory growing.
94
+ if (this.heads[p] >= COMPACT_AT) {
95
+ queue.splice(0, this.heads[p]);
96
+ this.heads[p] = 0;
97
+ const movie = this.movie;
98
+ movie.clips = movie.clips.filter((clip) => !movie.removed(clip));
99
+ }
100
+ if (this.heads[p] < queue.length) {
101
+ this.taken = p;
102
+ return queue[this.heads[p]++];
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Run what is queued, by priority, what it queues included: the actions
109
+ * of a clip still on the display list but an unload's; a frame entry's
110
+ * blocks sharing a constant pool, each starting with the one the block
111
+ * before left.
112
+ */
113
+ run() {
114
+ const movie = this.movie;
115
+ if (!movie.loaded || this.running) {
116
+ return;
117
+ }
118
+ this.running = true;
119
+ let pool = [];
120
+ let last = null;
121
+ try {
122
+ for (let q = this.next(); q !== null; q = this.next()) {
123
+ if (movie.halted || movie.rt.disabled) {
124
+ continue;
125
+ }
126
+ // A goto that queues its own frame again and again loops here, as a jump back does.
127
+ if (--movie.realm.budget < 0) {
128
+ this.timeout();
129
+ }
130
+ this.priority = this.taken;
131
+ if (q.kind === FRAME) {
132
+ if (last === null || last.clip !== q.clip || last.entry !== q.entry) {
133
+ pool = [];
134
+ }
135
+ last = q;
136
+ if (!this.gone(q.clip)) {
137
+ pool = this.runOne(q, pool);
138
+ }
139
+ }
140
+ else {
141
+ this.runOne(q, []);
142
+ }
143
+ }
144
+ }
145
+ finally {
146
+ this.running = false;
147
+ for (let p = 0; p < this.queues.length; p++) {
148
+ this.queues[p].length = 0;
149
+ this.heads[p] = 0;
150
+ }
151
+ }
152
+ }
153
+ /** The queue's own check of the script timeout, which disables the movie's actions past it. */
154
+ timeout() {
155
+ const cx = this.movie.activationOf(this.movie.root);
156
+ if (cx !== null) {
157
+ this.movie.rt.call(cx, () => this.movie.realm.timeout());
158
+ }
159
+ }
160
+ /**
161
+ * A function of the SWF's returned to code the queue runs: Flash runs
162
+ * what was queued by then of the passes before that code's, a frame
163
+ * action's initializations and constructions, a construction's
164
+ * initializations (adl, and the corpus's register_and_init_order).
165
+ */
166
+ returned() {
167
+ if (!this.running) {
168
+ return;
169
+ }
170
+ const outer = this.priority;
171
+ try {
172
+ for (let q = this.next(INITIALIZE, outer - 1); q !== null; q = this.next(INITIALIZE, outer - 1)) {
173
+ if (!this.movie.halted && !this.movie.rt.disabled) {
174
+ this.priority = this.taken;
175
+ this.runOne(q, []);
176
+ }
177
+ }
178
+ }
179
+ finally {
180
+ this.priority = outer;
181
+ }
182
+ }
183
+ /**
184
+ * Whether the clip of a queued action is gone: its actions do not run
185
+ * but an unload's. One kept a frame for an unload handler is, where it
186
+ * has clip actions of its own; one without, kept for an onUnload or for
187
+ * a clip in it, runs what it queued before (adl; Ruffle skips them all).
188
+ */
189
+ gone(d) {
190
+ if (this.movie.removed(d)) {
191
+ return true;
192
+ }
193
+ const native = nativeOf(d);
194
+ return native?.pending === true && native.handlers !== null;
195
+ }
196
+ /** Run one queued action, from constant pool `pool` for a FRAME; the pool it leaves. */
197
+ runOne(q, pool) {
198
+ const clip = q.clip;
199
+ if (q.kind !== FRAME && !q.unload && this.gone(clip)) {
200
+ return pool;
201
+ }
202
+ switch (q.kind) {
203
+ case FRAME:
204
+ // A clip a load has filled since runs none of what it queued before.
205
+ if (q.swf !== this.movie.swfOf(clip)) {
206
+ return pool;
207
+ }
208
+ for (const index of q.swf.list?.byTag.get(q.index) ?? NO_BLOCKS) {
209
+ pool = this.runBlock(q.swf, index, pool, clip);
210
+ }
211
+ return pool;
212
+ case BLOCK:
213
+ this.runBlock(q.swf, q.index, [], clip);
214
+ break;
215
+ case CONSTRUCTION:
216
+ this.construction(q);
217
+ break;
218
+ case METHOD: {
219
+ const face = clip.avm1;
220
+ const cx = this.movie.activationOf(clip);
221
+ if (face !== null && cx !== null && !this.movie.removed(clip)) {
222
+ this.movie.rt.callMethod(cx, face, q.name, NO_ARGS, this.movie.swfOf(clip).version);
223
+ }
224
+ break;
225
+ }
226
+ case HALT:
227
+ this.movie.halted = true;
228
+ break;
229
+ case CALL: {
230
+ const cx = this.movie.activationOf(clip);
231
+ if (cx !== null && q.object !== null) {
232
+ this.movie.rt.callMethod(cx, q.object, q.name, q.args, this.movie.version);
233
+ }
234
+ break;
235
+ }
236
+ case NOTIFY: {
237
+ const cx = this.movie.activationOf(clip);
238
+ const object = q.object;
239
+ if (cx !== null && object !== null) {
240
+ this.movie.rt.call(cx, () => {
241
+ avm1.broadcastMessage(object, q.name, q.args, this.movie.version, (listener) => {
242
+ const display = listener.display;
243
+ return display instanceof ClipNative && this.movie.removed(display.target);
244
+ });
245
+ });
246
+ }
247
+ break;
248
+ }
249
+ }
250
+ return pool;
251
+ }
252
+ /**
253
+ * A timeline's clip constructed: its registered class's prototype, its
254
+ * construct events, then the class's constructor on it.
255
+ */
256
+ construction(q) {
257
+ const face = q.clip.avm1;
258
+ if (face === null) {
259
+ return;
260
+ }
261
+ const constr = this.movie.classes.classOf(q.clip);
262
+ if (constr !== null) {
263
+ face.define("__proto__", avm1.get(constr, "prototype", this.movie.swfOf(q.clip).version), avm1.DONT_ENUM | avm1.DONT_DELETE);
264
+ }
265
+ for (const block of q.blocks) {
266
+ this.runBlock(q.swf, block, [], q.clip);
267
+ }
268
+ if (constr !== null) {
269
+ this.movie.scriptClips.construct(q.clip, face, constr);
270
+ }
271
+ }
272
+ /** CallFrame: the actions of `clip`'s frame `frame`, run now in order, each with a pool of its own. */
273
+ callFrame(clip, frame) {
274
+ const swf = this.movie.swfOf(clip);
275
+ for (const command of clip.timeline.frames[frame - 1] ?? []) {
276
+ if (command.type === "actions") {
277
+ for (const index of swf.list?.byTag.get(command.tag) ?? []) {
278
+ this.runBlock(swf, index, [], clip);
279
+ }
280
+ }
281
+ }
282
+ }
283
+ /**
284
+ * Run `swf`'s block `index` with `clip` as its target, starting from
285
+ * constant pool `pool`; the pool it leaves.
286
+ */
287
+ runBlock(swf, index, pool, clip) {
288
+ const regions = swf?.blocks[index];
289
+ const cx = regions ? this.movie.activationOf(clip, pool) : null;
290
+ if (!regions || cx === null) {
291
+ return pool;
292
+ }
293
+ try {
294
+ this.movie.rt.run(regions, cx);
295
+ }
296
+ catch (error) {
297
+ if (!(error instanceof avm1.Halt)) {
298
+ this.movie.onUncaught(error);
299
+ }
300
+ }
301
+ return cx.pool;
302
+ }
303
+ }
@@ -0,0 +1,106 @@
1
+ import { updateMixes } from "../media/sounds.js";
2
+ import { FULL, mixOfTransform, } from "./globals/Sound.js";
3
+ import { asciiLower } from "./paths.js";
4
+ import { NO_ARGS } from "./queue.js";
5
+ /** The movie's sounds, as Sound and the timeline's sounds see them. */
6
+ export class Avm1Sounds {
7
+ movie;
8
+ audio;
9
+ /** What the timeline's sounds, and Sound's, play by. */
10
+ sounds;
11
+ /** The frames played, which the timeline's sounds count by. */
12
+ frames = 0;
13
+ /** Each sound decoded once for the device. */
14
+ decodes = new WeakMap();
15
+ /** The transforms Sound gave clips, and the global one. */
16
+ soundTransforms = new WeakMap();
17
+ globalSoundTransform = FULL;
18
+ /** The Sounds whose sound ended, for their onSoundComplete after the frame's actions. */
19
+ completed = [];
20
+ constructor(movie, audio) {
21
+ this.movie = movie;
22
+ this.audio = audio;
23
+ const media = this;
24
+ this.sounds = {
25
+ get audio() {
26
+ return media.audio;
27
+ },
28
+ get now() {
29
+ return movie.timers.now();
30
+ },
31
+ get frames() {
32
+ return media.frames;
33
+ },
34
+ get frameRate() {
35
+ return movie.frameRate;
36
+ },
37
+ soundClip: (character) => this.soundClip(character),
38
+ ownMix: (d) => {
39
+ const t = this.soundTransforms.get(d);
40
+ return t === undefined ? undefined : mixOfTransform(t);
41
+ },
42
+ get mixer() {
43
+ return mixOfTransform(media.globalSoundTransform);
44
+ },
45
+ scriptSounds: () => 0,
46
+ };
47
+ }
48
+ get realm() {
49
+ return this.movie.realm;
50
+ }
51
+ resolve(value, version) {
52
+ return this.movie.resolve(value, version);
53
+ }
54
+ /** The DefineSound ExportAssets named `name`, any case, as attachSound finds it. */
55
+ exportedSound(name) {
56
+ const swf = this.movie.currentSwf();
57
+ const id = swf.exports.get(asciiLower(name));
58
+ const character = id === undefined ? undefined : swf.library?.characters.get(id);
59
+ return character?.type === "sound" ? character : null;
60
+ }
61
+ soundTransform(d) {
62
+ return d === null ? this.globalSoundTransform : (this.soundTransforms.get(d) ?? FULL);
63
+ }
64
+ setSoundTransform(d, transform) {
65
+ if (d === null) {
66
+ this.globalSoundTransform = transform;
67
+ }
68
+ else {
69
+ this.soundTransforms.set(d, transform);
70
+ }
71
+ updateMixes(this.sounds);
72
+ }
73
+ /** A Sound's sound has ended: its onSoundComplete runs once the frame's actions have. */
74
+ complete(o) {
75
+ this.completed.push(o);
76
+ }
77
+ /** Each ended Sound's onSoundComplete, in the root's activation: whether any ran. */
78
+ soundsCompleted() {
79
+ const completed = this.completed;
80
+ this.completed = [];
81
+ const movie = this.movie;
82
+ const root = movie.root;
83
+ if (completed.length === 0 || root === null) {
84
+ return false;
85
+ }
86
+ const cx = movie.activationOf(root);
87
+ for (const o of completed) {
88
+ if (cx !== null && !movie.halted) {
89
+ movie.rt.callMethod(cx, o, "onSoundComplete", NO_ARGS, movie.version);
90
+ }
91
+ }
92
+ return true;
93
+ }
94
+ soundClip(character) {
95
+ const audio = this.audio;
96
+ if (audio === null) {
97
+ return null;
98
+ }
99
+ let clip = this.decodes.get(character);
100
+ if (clip === undefined) {
101
+ clip = Promise.resolve().then(() => audio.decode(character.definition));
102
+ this.decodes.set(character, clip);
103
+ }
104
+ return clip;
105
+ }
106
+ }
@@ -0,0 +1,141 @@
1
+ // One AVM1 SWF the player runs, the main one or one loadMovie loaded, and
2
+ // what is read of its action list once: its root's frames' exports,
3
+ // DoInitAction blocks, ScriptLimits and the places Flash cannot read, a
4
+ // place's clip actions and a button's condition blocks.
5
+ // The per-movie library and button conditions follow Ruffle's
6
+ // (https://github.com/ruffle-rs/ruffle): MIT OR Apache-2.0, Copyright (c)
7
+ // 2018-2022 Ruffle LLC and Ruffle contributors.
8
+ import { ClipEvent, readExports, tags, } from "../../format/index.js";
9
+ /** The first of `events`, a place's field of all events, by which Flash stops. */
10
+ export function stopOf(events) {
11
+ if (events & (ClipEvent.load | ClipEvent.initialize)) {
12
+ return "place";
13
+ }
14
+ if (events & ClipEvent.construct) {
15
+ return "construct";
16
+ }
17
+ return events & ClipEvent.enterFrame ? "enterFrame" : null;
18
+ }
19
+ const STOPS = ["place", "construct", "enterFrame"];
20
+ export const NO_HANDLERS = [];
21
+ const NO_BUTTON_HANDLERS = [];
22
+ /**
23
+ * One AVM1 SWF the player runs, the main one or one loadMovie loaded: its
24
+ * blocks, its library and what its root's frames export and initialize,
25
+ * which its own code and timelines use, not another's (Ruffle's per-movie
26
+ * library). Every SWF shares the player's realm, `_global` among it.
27
+ */
28
+ export class Avm1Swf {
29
+ library;
30
+ list;
31
+ version;
32
+ url;
33
+ length;
34
+ size;
35
+ /** Its module's blocks, by index. */
36
+ blocks = [];
37
+ /** By its root's frame, 1 the first. */
38
+ frames = new Map();
39
+ /** The sprites whose DoInitAction has run. */
40
+ initialized = new Set();
41
+ /** Exported characters by name in lower case, as attachMovie finds them, and each one's name. */
42
+ exports = new Map();
43
+ exportNames = new Map();
44
+ /** Each button character's condition blocks, by its id, gathered from the action list once. */
45
+ buttonHandlers = null;
46
+ /** The clip that plays it as its root: level 0's, a level's or the clip it was loaded into. */
47
+ root = null;
48
+ constructor(library, list, version,
49
+ /** Its URL, which `_url` gives. */
50
+ url,
51
+ /** Its length in bytes, which getBytesTotal and getBytesLoaded give for its root. */
52
+ length,
53
+ /** Its size as it came, compressed, which MovieClipLoader.getProgress gives. */
54
+ size = length) {
55
+ this.library = library;
56
+ this.list = list;
57
+ this.version = version;
58
+ this.url = url;
59
+ this.length = length;
60
+ this.size = size;
61
+ }
62
+ }
63
+ /** Each root frame's exports, DoInitAction blocks, the tags Flash cannot read and its ScriptLimits. */
64
+ export function readRootFrames(swf, into) {
65
+ const list = into.list;
66
+ if (list === null) {
67
+ return;
68
+ }
69
+ // The root has a frame a ShowFrame tag ends; what follows the last is the last's.
70
+ const last = Math.max(1, swf.tags.filter((t) => t.code === tags.ShowFrame).length);
71
+ const frameOf = (frame) => {
72
+ const at = Math.min(frame, last);
73
+ let actions = into.frames.get(at);
74
+ if (!actions) {
75
+ actions = { exports: [], inits: [], stop: null, limits: null };
76
+ into.frames.set(at, actions);
77
+ }
78
+ return actions;
79
+ };
80
+ for (const block of list.blocks) {
81
+ const owner = block.owner;
82
+ if (block.length > 0 && owner.type === "init" && owner.timeline === null) {
83
+ frameOf(owner.frame + 1).inits.push({ sprite: owner.sprite, block: block.index });
84
+ }
85
+ }
86
+ // A ScriptLimits takes effect as its frame comes, before the frame's
87
+ // actions, the frame's last one if it has two (adl): two u16s, the
88
+ // recursion depth and the script timeout in seconds.
89
+ let frame = 1;
90
+ for (const tag of swf.tags) {
91
+ const events = list.corruptEvents.get(tag.offset);
92
+ if (tag.code === tags.ShowFrame) {
93
+ frame++;
94
+ }
95
+ else if (tag.code === tags.ScriptLimits && tag.length >= 4) {
96
+ const at = tag.offset;
97
+ const b = swf.bytes;
98
+ frameOf(frame).limits = [b[at] | (b[at + 1] << 8), b[at + 2] | (b[at + 3] << 8)];
99
+ }
100
+ else if (tag.code === tags.ExportAssets) {
101
+ frameOf(frame).exports.push(...readExports(swf.bytes, tag));
102
+ }
103
+ else if (events !== undefined) {
104
+ const actions = frameOf(frame);
105
+ const stop = stopOf(events);
106
+ if (stop && (!actions.stop || STOPS.indexOf(stop) < STOPS.indexOf(actions.stop))) {
107
+ actions.stop = stop;
108
+ }
109
+ }
110
+ }
111
+ }
112
+ /** A place's clip actions, with the events each runs for, as `swf`'s action list has them. */
113
+ export function handlersOf(place, swf) {
114
+ const list = swf.list;
115
+ if (place.actions === null || place.actions.length === 0 || list === null) {
116
+ return null;
117
+ }
118
+ const handlers = [];
119
+ for (const index of place.actions) {
120
+ const owner = list.blocks[index].owner;
121
+ if (owner.type === "clip") {
122
+ handlers.push({ events: owner.events, key: owner.key, block: index });
123
+ }
124
+ }
125
+ return handlers;
126
+ }
127
+ /** `id`'s condition blocks: a DefineButton's one, or a DefineButton2's, one a BUTTONCONDACTION. */
128
+ export function handlersOfButton(swf, id) {
129
+ if (swf.buttonHandlers === null) {
130
+ const handlers = new Map();
131
+ for (const [block, { owner }] of (swf.list?.blocks ?? []).entries()) {
132
+ if (owner.type === "button") {
133
+ const list = handlers.get(owner.button) ?? [];
134
+ list.push({ conditions: owner.conditions, key: owner.key, block });
135
+ handlers.set(owner.button, list);
136
+ }
137
+ }
138
+ swf.buttonHandlers = handlers;
139
+ }
140
+ return swf.buttonHandlers.get(id) ?? NO_BUTTON_HANDLERS;
141
+ }
@@ -0,0 +1,113 @@
1
+ // An AVM1 movie's clock: the time getTimer and setInterval's timers go by,
2
+ // the real clock's or the frames', and the script timeout's start and end
3
+ // around the scripts that run. On the real clock, a script that spins on
4
+ // getTimer to wait has the clock skip to the time it waits for, as AS3's
5
+ // does (clock.ts).
6
+ // GetTime's frame clock follows Ruffle's (https://github.com/ruffle-rs/
7
+ // ruffle): MIT OR Apache-2.0, Copyright (c) 2018-2022 Ruffle LLC and Ruffle
8
+ // contributors.
9
+ import { SpinClock } from "../clock.js";
10
+ import { MovieClip } from "../display/display.js";
11
+ /** The ms in a frame of the SWF's rate. */
12
+ const frameMs = (rate) => 1000 / (rate || 24);
13
+ export const defaultClock = () => typeof performance !== "undefined" ? () => performance.now() : null;
14
+ /** The real clock the script timeout reads, whatever clock the timers go by. */
15
+ const timeoutClock = typeof performance !== "undefined" ? () => performance.now() : () => Date.now();
16
+ /** The movie's clock and its timers, which fire between frames. */
17
+ export class Timers {
18
+ movie;
19
+ realTime;
20
+ /** The frame clock, ms since the start, a frame's duration on each frame. */
21
+ frameClock = 0;
22
+ /** GetTime's calls in the frame, and what they have added to a frame clock that stands still. */
23
+ timeCalls = 0;
24
+ timeOffset = 0;
25
+ /** The real clock's reading at the start. */
26
+ start;
27
+ /** How deep begin() is: only the outermost begin and end start and stop the scripts' clock. */
28
+ beginDepth = 0;
29
+ /** getTimer on the real clock, skipping a spin on it; none on the frame clock. */
30
+ spin;
31
+ constructor(movie, realTime) {
32
+ this.movie = movie;
33
+ this.realTime = realTime;
34
+ this.start = this.realTime?.() ?? 0;
35
+ const real = this.realTime;
36
+ this.spin = real === null ? null : new SpinClock(() => real() - this.start);
37
+ }
38
+ /** A frame starts: GetTime's calls are counted afresh. */
39
+ frameStarted() {
40
+ this.timeCalls = 0;
41
+ this.spin?.settle();
42
+ }
43
+ /** Timers fire between frames: a spin's calls are counted afresh. */
44
+ idleStarted() {
45
+ this.spin?.settle();
46
+ }
47
+ /**
48
+ * How far getTimer and the timers run ahead of the real clock, in ms,
49
+ * since a spin had the clock skip to the time it waited for: the frames
50
+ * wait for the real clock (Player.advance). Ends the pass that ran.
51
+ */
52
+ ahead() {
53
+ return this.spin?.ahead() ?? 0;
54
+ }
55
+ /** A frame's actions have run: until the next frame, its time passes and the timers due fire. */
56
+ afterFrame(rate) {
57
+ this.frameClock += frameMs(rate);
58
+ this.fire();
59
+ }
60
+ /**
61
+ * The time on the player's clock: the real clock's since the start, and
62
+ * what a spin skipped on getTimer, so that the timers keep to it; or the
63
+ * frame clock.
64
+ */
65
+ now() {
66
+ if (this.realTime === null || this.spin === null) {
67
+ return this.frameClock;
68
+ }
69
+ const real = this.realTime() - this.start;
70
+ return real + this.spin.lead(real);
71
+ }
72
+ /**
73
+ * GetTime: whole ms since the start. A frame clock stands still through
74
+ * a frame, so, as Ruffle has it, a script that asks it again and again,
75
+ * waiting for it to move, sees a ms pass every fifth call from the 20th.
76
+ */
77
+ getTime() {
78
+ if (this.spin !== null) {
79
+ return Math.floor(this.spin.read());
80
+ }
81
+ this.timeCalls++;
82
+ if (this.timeCalls >= 20 && this.timeCalls % 5 === 0) {
83
+ this.timeOffset++;
84
+ }
85
+ return Math.floor(this.movie.realm.timers.now) + this.timeOffset;
86
+ }
87
+ /** Scripts start running: the script timeout counts from now. */
88
+ begin() {
89
+ if (this.beginDepth++ > 0) {
90
+ return;
91
+ }
92
+ this.movie.realm.timers.now = this.now();
93
+ this.movie.rt.begin(timeoutClock(), timeoutClock);
94
+ }
95
+ end() {
96
+ if (--this.beginDepth > 0) {
97
+ return;
98
+ }
99
+ this.movie.rt.end();
100
+ }
101
+ /** The timers due by now, each running what it queues after it. */
102
+ fire() {
103
+ const movie = this.movie;
104
+ const root = movie.root;
105
+ if (movie.realm.timers.size === 0 || root === null) {
106
+ return;
107
+ }
108
+ movie.rt.fireTimers(this.now(), movie.version, () => movie.activationOf(root), () => movie.queue.run(), (object) => {
109
+ const target = object.display?.target;
110
+ return target instanceof MovieClip && movie.removed(target);
111
+ });
112
+ }
113
+ }