@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,549 @@
1
+ // Array, as Ruffle's (https://github.com/ruffle-rs/ruffle)
2
+ // core/src/avm1/globals/array.rs has it: MIT OR Apache-2.0, Copyright (c)
3
+ // 2018-2022 Ruffle LLC and Ruffle contributors. Where adl parts from
4
+ // Ruffle, adl decides (docs/avm1.md, "Array and String").
5
+ //
6
+ // The methods read and write an object's own elements as adl does: a read
7
+ // takes the stored value, no getter called and nothing inherited; a write
8
+ // tells the element's watcher, and an array's `length`'s watcher as it
9
+ // grows, then stores the value unless it is read-only, no setter called.
10
+ // Most writes delete the element first, so that it comes last in for..in's
11
+ // order, and its attributes go with it unless it cannot be deleted. A dense array no watcher looks at takes the same steps directly
12
+ // on its elements, without names.
13
+ import { lowerCase } from "../case.js";
14
+ import { Avm1Function, Avm1Object, DONT_DELETE, DONT_ENUM, growTo, invoke, lengthOf, Property, READ_ONLY, removeOwn, truncate, watched, } from "../objects.js";
15
+ import { clampInt } from "../operators.js";
16
+ import { isPrimitive, stringOf, toNumber } from "../values.js";
17
+ // sort's and sortOn's options.
18
+ const CASE_INSENSITIVE = 1;
19
+ const DESCENDING = 2;
20
+ const UNIQUE_SORT = 4;
21
+ const RETURN_INDEXED_ARRAY = 8;
22
+ const NUMERIC = 16;
23
+ /** Element `i`'s stored value, undefined where there is none. */
24
+ function element(a, i) {
25
+ const elems = a.elems;
26
+ if (elems !== null) {
27
+ return i >= 0 && i < elems.length ? elems[i].value : undefined;
28
+ }
29
+ const p = a.props.get(String(i));
30
+ return p === undefined ? undefined : p.value;
31
+ }
32
+ /**
33
+ * Element `i` set: an array's `length` grown past it first, its watcher
34
+ * told, then the element's, then the value stored unless it is read-only.
35
+ */
36
+ function setElement(a, i, value, version) {
37
+ if (a.array && i >= lengthOf(a, version)) {
38
+ growTo(a, (i + 1) | 0, version);
39
+ }
40
+ const elems = a.elems;
41
+ if (elems !== null && a.watchers === null && i >= 0 && i <= elems.length) {
42
+ if (i < elems.length) {
43
+ store(elems[i], value);
44
+ }
45
+ else {
46
+ a.add(String(i), value, 0);
47
+ }
48
+ return;
49
+ }
50
+ const name = String(i);
51
+ if (a.watchers !== null) {
52
+ value = watched(a, name, a.exact(name)?.value, value, version);
53
+ }
54
+ const p = a.exact(name);
55
+ if (p === undefined) {
56
+ a.add(name, value, 0);
57
+ }
58
+ else {
59
+ store(p, value);
60
+ }
61
+ }
62
+ function store(p, value) {
63
+ if ((p.flags & READ_ONLY) === 0) {
64
+ p.value = value;
65
+ }
66
+ }
67
+ /** Element `i` deleted, unless it cannot be. */
68
+ function deleteElement(a, i) {
69
+ const elems = a.elems;
70
+ if (elems === null) {
71
+ removeOwn(a, String(i), 7);
72
+ }
73
+ else if (i >= 0 && i < elems.length) {
74
+ const p = elems[i];
75
+ if ((p.flags & DONT_DELETE) === 0) {
76
+ a.remove(p);
77
+ }
78
+ }
79
+ }
80
+ /** Element `i` deleted and set again, as most of Array's writes are: last in the order. */
81
+ function replaceElement(a, i, value, version) {
82
+ const elems = a.elems;
83
+ if (elems !== null && a.watchers === null && i >= 0 && i < elems.length) {
84
+ if (a.array && i >= lengthOf(a, version)) {
85
+ growTo(a, (i + 1) | 0, version);
86
+ }
87
+ const p = elems[i];
88
+ if (p.flags & DONT_DELETE) {
89
+ store(p, value);
90
+ }
91
+ else {
92
+ a.renew(p, value);
93
+ }
94
+ return;
95
+ }
96
+ deleteElement(a, i);
97
+ setElement(a, i, value, version);
98
+ }
99
+ /**
100
+ * `length` set, its watcher told, though what it gives is not kept (adl,
101
+ * an array or not): an array's elements past it deleted.
102
+ */
103
+ function setLength(a, length, version) {
104
+ const p = a.props.get("length");
105
+ if (a.watchers !== null) {
106
+ watched(a, "length", p === undefined ? undefined : p.value, length, version);
107
+ }
108
+ if (a.array && p !== undefined && typeof p.value === "number") {
109
+ truncate(a, length, p.value | 0);
110
+ }
111
+ if (p === undefined) {
112
+ a.add("length", length, 0);
113
+ }
114
+ else {
115
+ p.value = length;
116
+ }
117
+ }
118
+ /** An index as slice and splice take one: from the end where negative, within 0 and `length`. */
119
+ function absolute(index, length) {
120
+ return index < 0 ? Math.max(index + length, 0) : Math.min(index, length);
121
+ }
122
+ const toInt = (value, version) => toNumber(value, version) | 0;
123
+ /** The class: its constructor, prototype and methods. */
124
+ export function arrayClass(realm) {
125
+ const proto = new Avm1Object();
126
+ const constr = realm.classOf(proto, (self, args, version) => initArray(realm, self, args, version), (_, args, version) => {
127
+ const a = realm.newArray([], version);
128
+ return initArray(realm, a, args, version);
129
+ });
130
+ proto.define("__proto__", realm.objectProto, DONT_ENUM | DONT_DELETE);
131
+ for (const [name, value] of [
132
+ ["CASEINSENSITIVE", CASE_INSENSITIVE],
133
+ ["DESCENDING", DESCENDING],
134
+ ["UNIQUESORT", UNIQUE_SORT],
135
+ ["RETURNINDEXEDARRAY", RETURN_INDEXED_ARRAY],
136
+ ["NUMERIC", NUMERIC],
137
+ ]) {
138
+ constr.define(name, value, 0);
139
+ }
140
+ // ASnative(252, i): Array called as a function, then the methods in the order defined.
141
+ const table = [constr.native];
142
+ realm.natives.set(252, (i) => table[i] ?? null);
143
+ const define = (name, native) => {
144
+ table.push(native);
145
+ proto.define(name, realm.method(native), DONT_ENUM | DONT_DELETE);
146
+ };
147
+ const join = (self, separator, version) => {
148
+ const n = lengthOf(self, version);
149
+ let text = "";
150
+ for (let i = 0; i < n; i++) {
151
+ if (i > 0) {
152
+ text += separator;
153
+ }
154
+ text += stringOf(element(self, i), version);
155
+ }
156
+ return text;
157
+ };
158
+ define("push", (self, args, version) => {
159
+ // A dense array no watcher looks at takes its new elements at its end.
160
+ const elems = self.elems;
161
+ const p = self.props.get("length");
162
+ if (elems !== null &&
163
+ self.watchers === null &&
164
+ self.array &&
165
+ p !== undefined &&
166
+ p.value === elems.length) {
167
+ const length = elems.length;
168
+ for (let i = 0; i < args.length; i++) {
169
+ elems.push(new Property(String(length + i), args[i], 0));
170
+ }
171
+ p.value = elems.length;
172
+ return elems.length;
173
+ }
174
+ const length = lengthOf(self, version);
175
+ for (let i = 0; i < args.length; i++) {
176
+ setElement(self, length + i, args[i], version);
177
+ }
178
+ if (!self.array) {
179
+ setLength(self, length + args.length, version);
180
+ }
181
+ return length + args.length;
182
+ });
183
+ define("pop", (self, _, version) => {
184
+ const length = lengthOf(self, version);
185
+ if (length === 0) {
186
+ return undefined;
187
+ }
188
+ const last = element(self, length - 1);
189
+ deleteElement(self, length - 1);
190
+ if (self.array) {
191
+ setLength(self, length - 1, version);
192
+ }
193
+ return last;
194
+ });
195
+ define("concat", (self, args, version) => {
196
+ const values = [];
197
+ const spread = (o, first) => {
198
+ if (o instanceof Avm1Object &&
199
+ (o.array || (first && !(o instanceof Avm1Function) && o.primitive === undefined))) {
200
+ const n = lengthOf(o, version);
201
+ for (let i = 0; i < n; i++) {
202
+ values.push(element(o, i));
203
+ }
204
+ }
205
+ else {
206
+ values.push(o);
207
+ }
208
+ };
209
+ spread(self, true);
210
+ for (const arg of args) {
211
+ spread(arg, false);
212
+ }
213
+ return realm.newArray(values, version);
214
+ });
215
+ define("shift", (self, _, version) => {
216
+ const length = lengthOf(self, version);
217
+ if (length === 0) {
218
+ return undefined;
219
+ }
220
+ const first = element(self, 0);
221
+ for (let i = 1; i < length; i++) {
222
+ replaceElement(self, i - 1, element(self, i), version);
223
+ }
224
+ if (self.array) {
225
+ setLength(self, length - 1, version);
226
+ }
227
+ return first;
228
+ });
229
+ // adl: with nothing to add, nothing; else the elements moved up and
230
+ // the first ones cleared, `length` set again, and the new ones set.
231
+ define("unshift", (self, args, version) => {
232
+ const length = lengthOf(self, version);
233
+ const count = args.length;
234
+ if (count === 0) {
235
+ return length;
236
+ }
237
+ const total = length + count;
238
+ if (length > 0) {
239
+ if (self.array) {
240
+ setLength(self, total, version);
241
+ }
242
+ for (let i = length - 1; i >= 0; i--) {
243
+ replaceElement(self, i + count, element(self, i), version);
244
+ }
245
+ for (let i = 0; i < count; i++) {
246
+ replaceElement(self, i, undefined, version);
247
+ }
248
+ }
249
+ if (self.array) {
250
+ setLength(self, total, version);
251
+ }
252
+ for (let i = 0; i < count; i++) {
253
+ replaceElement(self, i, args[i], version);
254
+ }
255
+ return total;
256
+ });
257
+ define("slice", (self, args, version) => {
258
+ const length = lengthOf(self, version);
259
+ const start = absolute(args.length > 0 ? toInt(args[0], version) : 0, length);
260
+ const end = args.length > 1 && args[1] !== undefined ? absolute(toInt(args[1], version), length) : length;
261
+ const values = [];
262
+ for (let i = start; i < end; i++) {
263
+ values.push(element(self, i));
264
+ }
265
+ return realm.newArray(values, version);
266
+ });
267
+ define("join", (self, args, version) => join(self, args.length > 0 ? stringOf(args[0], version) : ",", version));
268
+ // adl rebuilds the whole array: `length` set to 0, then every element set again.
269
+ define("splice", (self, args, version) => {
270
+ if (args.length === 0 || args[0] === undefined) {
271
+ return undefined;
272
+ }
273
+ const length = lengthOf(self, version);
274
+ const start = absolute(toInt(args[0], version), length);
275
+ let count = length - start;
276
+ if (args.length > 1) {
277
+ if (args[1] === undefined) {
278
+ return undefined;
279
+ }
280
+ count = Math.min(toInt(args[1], version), length - start);
281
+ }
282
+ if (count < 0) {
283
+ return undefined;
284
+ }
285
+ const removed = [];
286
+ for (let i = 0; i < count; i++) {
287
+ removed.push(element(self, start + i));
288
+ }
289
+ const values = [];
290
+ for (let i = 0; i < start; i++) {
291
+ values.push(element(self, i));
292
+ }
293
+ for (let i = 2; i < args.length; i++) {
294
+ values.push(args[i]);
295
+ }
296
+ for (let i = start + count; i < length; i++) {
297
+ values.push(element(self, i));
298
+ }
299
+ rebuild(self, values, version);
300
+ return realm.newArray(removed, version);
301
+ });
302
+ define("toString", (self, _, version) => join(self, ",", version));
303
+ define("sort", (self, args, version) => {
304
+ let compare = null;
305
+ let options = 0;
306
+ const a0 = args.length > 0 ? args[0] : undefined;
307
+ if (args.length > 0) {
308
+ if (a0 instanceof Avm1Object) {
309
+ // adl sorts by its own order with an object that is no function.
310
+ compare = a0 instanceof Avm1Function ? a0 : null;
311
+ options = typeof args[1] === "number" ? toInt(args[1], version) : 0;
312
+ }
313
+ else if (typeof a0 === "number") {
314
+ options = toInt(typeof args[1] === "number" ? args[1] : a0, version);
315
+ }
316
+ else {
317
+ return undefined;
318
+ }
319
+ }
320
+ const order = compare === null
321
+ ? (x, y) => compareValues(x, y, options & ~DESCENDING, version)
322
+ : (x, y) => {
323
+ const n = toNumber(invoke(compare, undefined, [x.value, y.value], version), version);
324
+ return n < 0 ? -1 : n > 0 ? 1 : 0;
325
+ };
326
+ return sortItems(realm, self, order, options, false, version);
327
+ });
328
+ define("reverse", (self, _, version) => {
329
+ const length = lengthOf(self, version);
330
+ for (let lower = 0; lower < length >> 1; lower++) {
331
+ const upper = length - lower - 1;
332
+ const low = element(self, lower);
333
+ const high = element(self, upper);
334
+ // Each set in turn, as a watcher of the second sees.
335
+ replaceElement(self, lower, high, version);
336
+ replaceElement(self, upper, low, version);
337
+ }
338
+ return self;
339
+ });
340
+ define("sortOn", (self, args, version) => {
341
+ if (args.length === 0) {
342
+ return undefined;
343
+ }
344
+ const names = args[0];
345
+ const fields = [];
346
+ if (names instanceof Avm1Object) {
347
+ if (!names.array) {
348
+ return sortItems(realm, self, (x, y) => compareValues(x, y, 0, version), 0, true, version);
349
+ }
350
+ const n = lengthOf(names, version);
351
+ if (n <= 0) {
352
+ return self;
353
+ }
354
+ for (let i = 0; i < n; i++) {
355
+ fields.push([stringOf(element(names, i), version), 0]);
356
+ }
357
+ const options = args.length > 1 ? args[1] : undefined;
358
+ if (options instanceof Avm1Object) {
359
+ if (options.array && lengthOf(options, version) === n) {
360
+ for (let i = 0; i < n; i++) {
361
+ fields[i][1] = toInt(element(options, i), version);
362
+ }
363
+ }
364
+ }
365
+ else if (args.length > 1) {
366
+ const all = toInt(options, version);
367
+ for (const f of fields) {
368
+ f[1] = all;
369
+ }
370
+ }
371
+ }
372
+ else {
373
+ fields.push([
374
+ stringOf(names, version),
375
+ typeof args[1] === "number" ? toInt(args[1], version) : 0,
376
+ ]);
377
+ }
378
+ const main = fields[0][1];
379
+ const order = (x, y) => {
380
+ const a = x.value;
381
+ const b = y.value;
382
+ if (!(a instanceof Avm1Object && b instanceof Avm1Object)) {
383
+ return compareValues(x, y, main, version);
384
+ }
385
+ for (const [name, options] of fields) {
386
+ const r = compareValues(item(-1, a.own(name, version)?.value, version), item(-1, b.own(name, version)?.value, version), options, version);
387
+ if (r !== 0) {
388
+ return r;
389
+ }
390
+ }
391
+ return 0;
392
+ };
393
+ return sortItems(realm, self, order, main, true, version);
394
+ });
395
+ return { constr, proto };
396
+ }
397
+ /** `self` made an array of `args`, or of a length where the one argument is a number. */
398
+ function initArray(realm, self, args, version) {
399
+ if (args.length === 1 && typeof args[0] === "number") {
400
+ realm.fillArray(self, [], version);
401
+ setLength(self, clampInt(args[0]), version);
402
+ return self;
403
+ }
404
+ return realm.fillArray(self, args, version);
405
+ }
406
+ function item(index, value, version) {
407
+ return { index, value, text: isPrimitive(value) ? stringOf(value, version) : null };
408
+ }
409
+ /** A string lower-cased as Flash compares one ignoring case. */
410
+ function lowered(s) {
411
+ let out = "";
412
+ for (let i = 0; i < s.length; i++) {
413
+ out += String.fromCharCode(lowerCase(s.charCodeAt(i)));
414
+ }
415
+ return out;
416
+ }
417
+ /**
418
+ * The default order: numbers by value where NUMERIC is asked and both are
419
+ * numbers, else by their strings' code units, ignoring case where asked;
420
+ * reversed where DESCENDING is.
421
+ */
422
+ function compareValues(x, y, options, version) {
423
+ const a = x.value;
424
+ const b = y.value;
425
+ let r;
426
+ if (options & NUMERIC && typeof a === "number" && typeof b === "number") {
427
+ r = a < b ? -1 : a > b ? 1 : 0;
428
+ }
429
+ else {
430
+ let s = x.text ?? stringOf(a, version);
431
+ let t = y.text ?? stringOf(b, version);
432
+ if (options & CASE_INSENSITIVE) {
433
+ s = lowered(s);
434
+ t = lowered(t);
435
+ }
436
+ r = s < t ? -1 : s > t ? 1 : 0;
437
+ }
438
+ return options & DESCENDING ? -r : r;
439
+ }
440
+ /**
441
+ * Flash's quicksort, as Ruffle has it: the leftmost element the pivot,
442
+ * which the comparator's calls, a function's that a SWF traces, show.
443
+ */
444
+ function quicksort(items, compare) {
445
+ if (items.length < 2) {
446
+ return;
447
+ }
448
+ const stack = [0, items.length - 1];
449
+ while (stack.length > 0) {
450
+ const high = stack.pop();
451
+ const low = stack.pop();
452
+ if (low >= high) {
453
+ continue;
454
+ }
455
+ const pivot = items[low];
456
+ let left = low + 1;
457
+ let right = high;
458
+ for (;;) {
459
+ while (left < right && compare(pivot, items[left]) > 0) {
460
+ left++;
461
+ }
462
+ while (right > low && compare(pivot, items[right]) <= 0) {
463
+ right--;
464
+ }
465
+ if (left >= right) {
466
+ break;
467
+ }
468
+ const t = items[left];
469
+ items[left] = items[right];
470
+ items[right] = t;
471
+ }
472
+ const t = items[low];
473
+ items[low] = items[right];
474
+ items[right] = t;
475
+ stack.push(right + 1, high);
476
+ if (right > 0) {
477
+ stack.push(low, right - 1);
478
+ }
479
+ }
480
+ }
481
+ /**
482
+ * sort's and sortOn's work: the elements sorted, reversed afterwards for
483
+ * sort's DESCENDING (sortOn's compares so), 0 for UNIQUESORT where two
484
+ * compare equal, the indices for RETURNINDEXEDARRAY, else the elements
485
+ * that moved set again, as adl sets them, and the array.
486
+ */
487
+ function sortItems(realm, self, compare, options, sortOn, version) {
488
+ const length = lengthOf(self, version);
489
+ const items = [];
490
+ for (let i = 0; i < length; i++) {
491
+ items.push(item(i, element(self, i), version));
492
+ }
493
+ quicksort(items, compare);
494
+ if (!sortOn && options & DESCENDING) {
495
+ items.reverse();
496
+ }
497
+ if (options & UNIQUE_SORT) {
498
+ const unique = sortOn ? compare : (x, y) => compareValues(x, y, options, version);
499
+ for (let i = 1; i < items.length; i++) {
500
+ if (unique(items[i - 1], items[i]) === 0) {
501
+ return 0;
502
+ }
503
+ }
504
+ }
505
+ if (options & RETURN_INDEXED_ARRAY) {
506
+ return realm.newArray(items.map((it) => it.index), version);
507
+ }
508
+ for (let i = 0; i < items.length; i++) {
509
+ if (items[i].index !== i) {
510
+ replaceElement(self, i, items[i].value, version);
511
+ }
512
+ }
513
+ return self;
514
+ }
515
+ /**
516
+ * The elements made `values`, as adl's splice makes them: `length` set to
517
+ * 0, then each element set in turn, a non-array's `length` after each.
518
+ */
519
+ function rebuild(self, values, version) {
520
+ const elems = self.elems;
521
+ const p = self.props.get("length");
522
+ if (elems !== null &&
523
+ self.watchers === null &&
524
+ self.array &&
525
+ p !== undefined &&
526
+ typeof p.value === "number" &&
527
+ elems.every((e) => (e.flags & DONT_DELETE) === 0)) {
528
+ // The same steps, the elements' properties kept and renewed in order.
529
+ const kept = elems.splice(0, elems.length);
530
+ for (let i = 0; i < values.length; i++) {
531
+ if (i < kept.length) {
532
+ self.renew(kept[i], values[i]);
533
+ elems.push(kept[i]);
534
+ }
535
+ else {
536
+ self.add(String(i), values[i], 0);
537
+ }
538
+ }
539
+ p.value = values.length;
540
+ return;
541
+ }
542
+ setLength(self, 0, version);
543
+ for (let i = 0; i < values.length; i++) {
544
+ setElement(self, i, values[i], version);
545
+ if (!self.array) {
546
+ setLength(self, i + 1, version);
547
+ }
548
+ }
549
+ }
@@ -0,0 +1,131 @@
1
+ // AsBroadcaster, which Flash writes in ActionScript and Ruffle in Rust
2
+ // (https://github.com/ruffle-rs/ruffle, core/src/avm1/globals/
3
+ // as_broadcaster.rs: MIT OR Apache-2.0, Copyright (c) 2018-2022 Ruffle LLC
4
+ // and Ruffle contributors), here in TypeScript as adl runs it (docs/avm1.md,
5
+ // "AsBroadcaster"): addListener removes the listener, then pushes it, so
6
+ // it comes last; removeListener splices out the first one equal to it;
7
+ // initialize copies AsBroadcaster's addListener and removeListener onto
8
+ // the object and gives it a new broadcastMessage, each hidden from SWF 5.
9
+ import { Avm1Function, Avm1Object, DONT_DELETE, DONT_ENUM, foundDepth, get, invoke, lengthOf, set, VERSION_6, } from "../objects.js";
10
+ import { looselyEquals } from "../operators.js";
11
+ import { stringOf, toNumber } from "../values.js";
12
+ /** `o.name(...args)`, as code calls a method. */
13
+ function callMethod(o, name, args, realm, version) {
14
+ if (o instanceof Avm1Object) {
15
+ const method = get(o, name, version);
16
+ return invoke(method, o, args, version, Math.max(foundDepth, 1));
17
+ }
18
+ if (o === undefined || o === null) {
19
+ return undefined;
20
+ }
21
+ return invoke(realm.primitiveMember(o, name, version), o, args, version, 1);
22
+ }
23
+ /** broadcastMessage(name, ...args): each listener's method of that name called, the listeners as they were. */
24
+ function broadcast() {
25
+ return (self, args, version) => {
26
+ if (args.length === 0) {
27
+ return undefined;
28
+ }
29
+ return broadcastMessage(self, stringOf(args[0], version), args.slice(1), version);
30
+ };
31
+ }
32
+ /**
33
+ * `self`'s broadcastMessage of `name` with `rest`, as the player sends Key's
34
+ * and Mouse's: undefined where it has no listeners, else true. A listener
35
+ * `removed` says is a clip taken off the display list hears nothing: a
36
+ * clip is found by its path, at which there is none (the corpus's
37
+ * `string_paths_keyevents`).
38
+ */
39
+ export function broadcastMessage(self, name, rest, version, removed) {
40
+ const listeners = get(self, "_listeners", version);
41
+ if (!(listeners instanceof Avm1Object)) {
42
+ return undefined;
43
+ }
44
+ const n = lengthOf(listeners, version);
45
+ if (n <= 0) {
46
+ return undefined;
47
+ }
48
+ // From SWF 7 the listeners as the call found them; up to 6 the array as it is
49
+ // by then, so that one a listener removes is not called (adl).
50
+ const snapshot = version >= 7 ? [] : null;
51
+ if (snapshot !== null) {
52
+ for (let i = 0; i < n; i++) {
53
+ snapshot.push(get(listeners, String(i), version));
54
+ }
55
+ }
56
+ for (let i = 0; i < n; i++) {
57
+ const listener = snapshot === null ? get(listeners, String(i), version) : snapshot[i];
58
+ if (!(listener instanceof Avm1Object) || removed?.(listener)) {
59
+ continue;
60
+ }
61
+ if (name === "") {
62
+ invoke(listener, listener, rest, version);
63
+ }
64
+ else {
65
+ const method = get(listener, name, version, listener, false);
66
+ invoke(method, listener, rest, version, Math.max(foundDepth, 1));
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+ /**
72
+ * `o` made a broadcaster, as AsBroadcaster.initialize makes it: its
73
+ * broadcastMessage, addListener, removeListener and an empty `_listeners`,
74
+ * hidden from SWF 5 as ASSetPropFlags(o, names, 131) hides them.
75
+ */
76
+ export function initializeBroadcaster(o, realm, version) {
77
+ const constr = realm.AsBroadcaster.constr;
78
+ const hidden = DONT_ENUM | DONT_DELETE | VERSION_6;
79
+ const install = (name, value) => {
80
+ set(o, name, value, version);
81
+ const p = o.own(name, version);
82
+ if (p !== undefined) {
83
+ p.flags |= hidden;
84
+ }
85
+ };
86
+ install("broadcastMessage", realm.method(broadcast()));
87
+ install("addListener", get(constr, "addListener", version));
88
+ install("removeListener", get(constr, "removeListener", version));
89
+ install("_listeners", realm.newArray([], version));
90
+ }
91
+ export function broadcasterClass(realm) {
92
+ const proto = new Avm1Object();
93
+ const constr = new Avm1Function(undefined, realm, () => undefined, (self) => self);
94
+ // `prototype` last, as adl lists it.
95
+ constr.define("constructor", realm.Function, DONT_ENUM | DONT_DELETE);
96
+ constr.define("__proto__", realm.functionProto, DONT_ENUM | DONT_DELETE | VERSION_6);
97
+ constr.define("prototype", proto, DONT_ENUM | DONT_DELETE | VERSION_6);
98
+ proto.define("constructor", constr, DONT_ENUM | DONT_DELETE);
99
+ proto.define("__proto__", realm.objectProto, DONT_ENUM | DONT_DELETE);
100
+ const flags = DONT_ENUM | DONT_DELETE | VERSION_6;
101
+ constr.define("broadcastMessage", realm.method(broadcast()), flags);
102
+ constr.define("addListener", realm.method((self, args, version) => {
103
+ const listener = args.length > 0 ? args[0] : undefined;
104
+ callMethod(self, "removeListener", [listener], realm, version);
105
+ callMethod(get(self, "_listeners", version), "push", [listener], realm, version);
106
+ return true;
107
+ }), flags);
108
+ constr.define("removeListener", realm.method((self, args, version) => {
109
+ const listener = args.length > 0 ? args[0] : undefined;
110
+ const listeners = get(self, "_listeners", version);
111
+ if (!(listeners instanceof Avm1Object)) {
112
+ return false;
113
+ }
114
+ const n = toNumber(get(listeners, "length", version), version) | 0;
115
+ for (let i = 0; i < n; i++) {
116
+ if (looselyEquals(get(listeners, String(i), version), listener, version)) {
117
+ callMethod(listeners, "splice", [i, 1], realm, version);
118
+ return true;
119
+ }
120
+ }
121
+ return false;
122
+ }), flags);
123
+ constr.define("initialize", realm.method((_, args, version) => {
124
+ const o = args.length > 0 ? args[0] : undefined;
125
+ if (o instanceof Avm1Object) {
126
+ initializeBroadcaster(o, realm, version);
127
+ }
128
+ return undefined;
129
+ }), flags);
130
+ return { constr, proto };
131
+ }