@swf2es/player-hosts 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (405) hide show
  1. package/LICENSE +202 -0
  2. package/LICENSE.third-party +759 -0
  3. package/README.md +43 -2
  4. package/dist/indexeddb.d.ts +27 -0
  5. package/dist/indexeddb.d.ts.map +1 -0
  6. package/dist/indexeddb.js +170 -0
  7. package/dist/indexeddb.js.map +1 -0
  8. package/dist/node-worker.d.ts +2 -0
  9. package/dist/node-worker.d.ts.map +1 -0
  10. package/dist/node-worker.js +12 -0
  11. package/dist/node-worker.js.map +1 -0
  12. package/dist/node.d.ts +8 -0
  13. package/dist/node.d.ts.map +1 -0
  14. package/dist/node.js +43 -0
  15. package/dist/node.js.map +1 -0
  16. package/dist/precompiled.d.ts +31 -0
  17. package/dist/precompiled.d.ts.map +1 -0
  18. package/dist/precompiled.js +125 -0
  19. package/dist/precompiled.js.map +1 -0
  20. package/dist/stage3d.d.ts +13 -0
  21. package/dist/stage3d.d.ts.map +1 -0
  22. package/dist/stage3d.js +61 -0
  23. package/dist/stage3d.js.map +1 -0
  24. package/dist/thread/codegen/codegen.js +308 -0
  25. package/dist/thread/codegen/index.js +405 -0
  26. package/dist/thread/format/abc-names.js +126 -0
  27. package/dist/thread/format/actions.js +222 -0
  28. package/dist/thread/format/air-descriptor.js +63 -0
  29. package/dist/thread/format/api-versions.js +22 -0
  30. package/dist/thread/format/bitmap.js +199 -0
  31. package/dist/thread/format/button.js +60 -0
  32. package/dist/thread/format/compression.js +200 -0
  33. package/dist/thread/format/display.js +305 -0
  34. package/dist/thread/format/filters.js +136 -0
  35. package/dist/thread/format/font.js +168 -0
  36. package/dist/thread/format/index.js +26 -0
  37. package/dist/thread/format/pbj.js +484 -0
  38. package/dist/thread/format/shape.js +411 -0
  39. package/dist/thread/format/sound.js +91 -0
  40. package/dist/thread/format/swf.js +163 -0
  41. package/dist/thread/format/tags.js +58 -0
  42. package/dist/thread/format/text.js +135 -0
  43. package/dist/thread/format/zip.js +91 -0
  44. package/dist/thread/native/audio/binary.js +3 -0
  45. package/dist/thread/native/audio/index.js +72 -0
  46. package/dist/thread/native/base64.js +9 -0
  47. package/dist/thread/native/compress/binary.js +3 -0
  48. package/dist/thread/native/compress/index.js +145 -0
  49. package/dist/thread/native/instance.js +49 -0
  50. package/dist/thread/native/mp3/binary.js +3 -0
  51. package/dist/thread/native/mp3/index.js +48 -0
  52. package/dist/thread/native/render/binary.js +3 -0
  53. package/dist/thread/native/render/bitmap-kernel.js +591 -0
  54. package/dist/thread/native/render/draw-kernel.js +204 -0
  55. package/dist/thread/native/render/dxt-encoder.js +94 -0
  56. package/dist/thread/native/render/index.js +10 -0
  57. package/dist/thread/native/render/lines.js +122 -0
  58. package/dist/thread/native/render/module.js +26 -0
  59. package/dist/thread/native/render/pixel-ops.js +235 -0
  60. package/dist/thread/native/render/tessellator.js +250 -0
  61. package/dist/thread/player/avm1/amf.js +507 -0
  62. package/dist/thread/player/avm1/avm1.js +1304 -0
  63. package/dist/thread/player/avm1/bindings.js +214 -0
  64. package/dist/thread/player/avm1/classes.js +75 -0
  65. package/dist/thread/player/avm1/clips.js +229 -0
  66. package/dist/thread/player/avm1/compile.js +140 -0
  67. package/dist/thread/player/avm1/external.js +79 -0
  68. package/dist/thread/player/avm1/focus.js +278 -0
  69. package/dist/thread/player/avm1/globals/BitmapData.js +542 -0
  70. package/dist/thread/player/avm1/globals/Button.js +31 -0
  71. package/dist/thread/player/avm1/globals/Color.js +115 -0
  72. package/dist/thread/player/avm1/globals/ExternalInterface.js +310 -0
  73. package/dist/thread/player/avm1/globals/FileReference.js +217 -0
  74. package/dist/thread/player/avm1/globals/Key.js +60 -0
  75. package/dist/thread/player/avm1/globals/LoadVars.js +208 -0
  76. package/dist/thread/player/avm1/globals/LocalConnection.js +92 -0
  77. package/dist/thread/player/avm1/globals/MovieClip.js +1070 -0
  78. package/dist/thread/player/avm1/globals/MovieClipLoader.js +90 -0
  79. package/dist/thread/player/avm1/globals/NetConnection.js +261 -0
  80. package/dist/thread/player/avm1/globals/PrintJob.js +37 -0
  81. package/dist/thread/player/avm1/globals/Selection.js +62 -0
  82. package/dist/thread/player/avm1/globals/SharedObject.js +245 -0
  83. package/dist/thread/player/avm1/globals/Sound.js +238 -0
  84. package/dist/thread/player/avm1/globals/Stage.js +12 -0
  85. package/dist/thread/player/avm1/globals/StyleSheet.js +205 -0
  86. package/dist/thread/player/avm1/globals/TextField.js +396 -0
  87. package/dist/thread/player/avm1/globals/TextFormat.js +194 -0
  88. package/dist/thread/player/avm1/globals/TextSnapshot.js +88 -0
  89. package/dist/thread/player/avm1/globals/XML.js +396 -0
  90. package/dist/thread/player/avm1/globals/XMLNode.js +413 -0
  91. package/dist/thread/player/avm1/globals/XMLSocket.js +205 -0
  92. package/dist/thread/player/avm1/globals/drawing.js +202 -0
  93. package/dist/thread/player/avm1/globals/filters.js +635 -0
  94. package/dist/thread/player/avm1/globals/geom.js +600 -0
  95. package/dist/thread/player/avm1/input.js +483 -0
  96. package/dist/thread/player/avm1/keyboard.js +113 -0
  97. package/dist/thread/player/avm1/loads.js +352 -0
  98. package/dist/thread/player/avm1/net.js +219 -0
  99. package/dist/thread/player/avm1/paths.js +104 -0
  100. package/dist/thread/player/avm1/pointer.js +512 -0
  101. package/dist/thread/player/avm1/queue.js +303 -0
  102. package/dist/thread/player/avm1/sound.js +106 -0
  103. package/dist/thread/player/avm1/swf.js +141 -0
  104. package/dist/thread/player/avm1/timers.js +113 -0
  105. package/dist/thread/player/bitmap/bitmap.js +627 -0
  106. package/dist/thread/player/bitmap/draw.js +68 -0
  107. package/dist/thread/player/bitmap/dxt.js +11 -0
  108. package/dist/thread/player/bitmap/filters.js +656 -0
  109. package/dist/thread/player/bitmap/images.js +240 -0
  110. package/dist/thread/player/bitmap/kernel.js +65 -0
  111. package/dist/thread/player/bitmap/ops.js +1239 -0
  112. package/dist/thread/player/bitmap/pixel-bender.js +911 -0
  113. package/dist/thread/player/bitmap/png.js +139 -0
  114. package/dist/thread/player/bitmap/turbulence.js +89 -0
  115. package/dist/thread/player/clock.js +182 -0
  116. package/dist/thread/player/display/bitmapobject.js +25 -0
  117. package/dist/thread/player/display/bounds.js +520 -0
  118. package/dist/thread/player/display/buttonobject.js +305 -0
  119. package/dist/thread/player/display/color.js +40 -0
  120. package/dist/thread/player/display/container.js +150 -0
  121. package/dist/thread/player/display/display.js +14 -0
  122. package/dist/thread/player/display/displayobject.js +664 -0
  123. package/dist/thread/player/display/drawing.js +613 -0
  124. package/dist/thread/player/display/filters.js +285 -0
  125. package/dist/thread/player/display/geometry.js +189 -0
  126. package/dist/thread/player/display/gradients.js +117 -0
  127. package/dist/thread/player/display/graphicsdata.js +592 -0
  128. package/dist/thread/player/display/instantiate.js +71 -0
  129. package/dist/thread/player/display/matrix3d.js +373 -0
  130. package/dist/thread/player/display/morph.js +226 -0
  131. package/dist/thread/player/display/movieclip.js +680 -0
  132. package/dist/thread/player/display/perspective.js +193 -0
  133. package/dist/thread/player/display/scale9.js +236 -0
  134. package/dist/thread/player/display/shapeobject.js +131 -0
  135. package/dist/thread/player/display/shapes.js +407 -0
  136. package/dist/thread/player/display/textobjects.js +222 -0
  137. package/dist/thread/player/display/timeline.js +471 -0
  138. package/dist/thread/player/display/value-lists.js +40 -0
  139. package/dist/thread/player/display/videoobject.js +6 -0
  140. package/dist/thread/player/display/walk.js +127 -0
  141. package/dist/thread/player/files.js +334 -0
  142. package/dist/thread/player/hosts.js +207 -0
  143. package/dist/thread/player/input/avm1.js +82 -0
  144. package/dist/thread/player/input/context-menu.js +63 -0
  145. package/dist/thread/player/input/keyboard.js +458 -0
  146. package/dist/thread/player/input/pointer.js +863 -0
  147. package/dist/thread/player/input/text-editor.js +319 -0
  148. package/dist/thread/player/input/touch.js +209 -0
  149. package/dist/thread/player/localconnection.js +90 -0
  150. package/dist/thread/player/media/audio.js +376 -0
  151. package/dist/thread/player/media/dynamic-sound.js +90 -0
  152. package/dist/thread/player/media/extract.js +135 -0
  153. package/dist/thread/player/media/mp3.js +152 -0
  154. package/dist/thread/player/media/sounds.js +507 -0
  155. package/dist/thread/player/media/streaming-audio.js +133 -0
  156. package/dist/thread/player/player.js +616 -0
  157. package/dist/thread/player/playerglobal/air/net/WebSocket.js +250 -0
  158. package/dist/thread/player/playerglobal/air-library.js +8 -0
  159. package/dist/thread/player/playerglobal/flash/accessibility/Accessibility.js +21 -0
  160. package/dist/thread/player/playerglobal/flash/crypto/generateRandomBytes.js +32 -0
  161. package/dist/thread/player/playerglobal/flash/data/EncryptedLocalStore.js +61 -0
  162. package/dist/thread/player/playerglobal/flash/desktop/Clipboard.js +173 -0
  163. package/dist/thread/player/playerglobal/flash/desktop/NativeApplication.js +179 -0
  164. package/dist/thread/player/playerglobal/flash/display/AVM1Movie.js +19 -0
  165. package/dist/thread/player/playerglobal/flash/display/Bitmap.js +58 -0
  166. package/dist/thread/player/playerglobal/flash/display/BitmapData.js +633 -0
  167. package/dist/thread/player/playerglobal/flash/display/DisplayObject.js +614 -0
  168. package/dist/thread/player/playerglobal/flash/display/DisplayObjectContainer.js +224 -0
  169. package/dist/thread/player/playerglobal/flash/display/Graphics.js +345 -0
  170. package/dist/thread/player/playerglobal/flash/display/InteractiveObject.js +87 -0
  171. package/dist/thread/player/playerglobal/flash/display/Loader.js +79 -0
  172. package/dist/thread/player/playerglobal/flash/display/LoaderInfo.js +128 -0
  173. package/dist/thread/player/playerglobal/flash/display/MovieClip.js +194 -0
  174. package/dist/thread/player/playerglobal/flash/display/NativeWindow.js +245 -0
  175. package/dist/thread/player/playerglobal/flash/display/Shader.js +26 -0
  176. package/dist/thread/player/playerglobal/flash/display/ShaderData.js +85 -0
  177. package/dist/thread/player/playerglobal/flash/display/ShaderInput.js +64 -0
  178. package/dist/thread/player/playerglobal/flash/display/ShaderJob.js +181 -0
  179. package/dist/thread/player/playerglobal/flash/display/ShaderParameter.js +23 -0
  180. package/dist/thread/player/playerglobal/flash/display/Shape.js +13 -0
  181. package/dist/thread/player/playerglobal/flash/display/SimpleButton.js +103 -0
  182. package/dist/thread/player/playerglobal/flash/display/Sprite.js +84 -0
  183. package/dist/thread/player/playerglobal/flash/display/Stage.js +231 -0
  184. package/dist/thread/player/playerglobal/flash/display/Stage3D.js +54 -0
  185. package/dist/thread/player/playerglobal/flash/display/shaders.js +228 -0
  186. package/dist/thread/player/playerglobal/flash/events/Event.js +58 -0
  187. package/dist/thread/player/playerglobal/flash/events/EventDispatcher.js +103 -0
  188. package/dist/thread/player/playerglobal/flash/events/GestureEvent.js +34 -0
  189. package/dist/thread/player/playerglobal/flash/events/HTTPStatusEvent.js +8 -0
  190. package/dist/thread/player/playerglobal/flash/events/KeyboardEvent.js +51 -0
  191. package/dist/thread/player/playerglobal/flash/events/MouseEvent.js +59 -0
  192. package/dist/thread/player/playerglobal/flash/events/PressAndTapGestureEvent.js +30 -0
  193. package/dist/thread/player/playerglobal/flash/events/TimerEvent.js +16 -0
  194. package/dist/thread/player/playerglobal/flash/events/TouchEvent.js +45 -0
  195. package/dist/thread/player/playerglobal/flash/external/ExternalInterface.js +73 -0
  196. package/dist/thread/player/playerglobal/flash/filesystem/File.js +340 -0
  197. package/dist/thread/player/playerglobal/flash/filesystem/FileStream.js +453 -0
  198. package/dist/thread/player/playerglobal/flash/filesystem/paths.js +156 -0
  199. package/dist/thread/player/playerglobal/flash/filesystem/writes.js +143 -0
  200. package/dist/thread/player/playerglobal/flash/filters/BevelFilter.js +4 -0
  201. package/dist/thread/player/playerglobal/flash/filters/BitmapFilter.js +205 -0
  202. package/dist/thread/player/playerglobal/flash/filters/BlurFilter.js +4 -0
  203. package/dist/thread/player/playerglobal/flash/filters/ColorMatrixFilter.js +11 -0
  204. package/dist/thread/player/playerglobal/flash/filters/ConvolutionFilter.js +26 -0
  205. package/dist/thread/player/playerglobal/flash/filters/DisplacementMapFilter.js +51 -0
  206. package/dist/thread/player/playerglobal/flash/filters/DropShadowFilter.js +4 -0
  207. package/dist/thread/player/playerglobal/flash/filters/GlowFilter.js +4 -0
  208. package/dist/thread/player/playerglobal/flash/filters/GradientBevelFilter.js +4 -0
  209. package/dist/thread/player/playerglobal/flash/filters/GradientGlowFilter.js +4 -0
  210. package/dist/thread/player/playerglobal/flash/filters/ShaderFilter.js +53 -0
  211. package/dist/thread/player/playerglobal/flash/geom/Matrix3D.js +361 -0
  212. package/dist/thread/player/playerglobal/flash/geom/PerspectiveProjection.js +122 -0
  213. package/dist/thread/player/playerglobal/flash/geom/Transform.js +245 -0
  214. package/dist/thread/player/playerglobal/flash/geom/Utils3D.js +85 -0
  215. package/dist/thread/player/playerglobal/flash/globalization/Collator.js +149 -0
  216. package/dist/thread/player/playerglobal/flash/globalization/CurrencyFormatter.js +272 -0
  217. package/dist/thread/player/playerglobal/flash/globalization/CurrencyParseResult.js +21 -0
  218. package/dist/thread/player/playerglobal/flash/globalization/DateTimeFormatter.js +463 -0
  219. package/dist/thread/player/playerglobal/flash/globalization/LocaleID.js +144 -0
  220. package/dist/thread/player/playerglobal/flash/globalization/NumberFormatter.js +444 -0
  221. package/dist/thread/player/playerglobal/flash/globalization/NumberParseResult.js +22 -0
  222. package/dist/thread/player/playerglobal/flash/globalization/StringTools.js +59 -0
  223. package/dist/thread/player/playerglobal/flash/globalization/locale.js +190 -0
  224. package/dist/thread/player/playerglobal/flash/media/Camera.js +89 -0
  225. package/dist/thread/player/playerglobal/flash/media/Microphone.js +126 -0
  226. package/dist/thread/player/playerglobal/flash/media/Sound.js +543 -0
  227. package/dist/thread/player/playerglobal/flash/media/SoundMixer.js +74 -0
  228. package/dist/thread/player/playerglobal/flash/media/SoundTransform.js +40 -0
  229. package/dist/thread/player/playerglobal/flash/media/Video.js +43 -0
  230. package/dist/thread/player/playerglobal/flash/net/FileFilter.js +27 -0
  231. package/dist/thread/player/playerglobal/flash/net/FileReference.js +197 -0
  232. package/dist/thread/player/playerglobal/flash/net/LocalConnection.js +167 -0
  233. package/dist/thread/player/playerglobal/flash/net/NetConnection.js +155 -0
  234. package/dist/thread/player/playerglobal/flash/net/SharedObject.js +299 -0
  235. package/dist/thread/player/playerglobal/flash/net/Socket.js +282 -0
  236. package/dist/thread/player/playerglobal/flash/net/URLRequest.js +93 -0
  237. package/dist/thread/player/playerglobal/flash/net/URLStream.js +146 -0
  238. package/dist/thread/player/playerglobal/flash/net/XMLSocket.js +14 -0
  239. package/dist/thread/player/playerglobal/flash/net/local-modern.js +142 -0
  240. package/dist/thread/player/playerglobal/flash/net/local-values.js +217 -0
  241. package/dist/thread/player/playerglobal/flash/net/navigateToURL.js +29 -0
  242. package/dist/thread/player/playerglobal/flash/profiler/Telemetry.js +25 -0
  243. package/dist/thread/player/playerglobal/flash/sensors/Accelerometer.js +12 -0
  244. package/dist/thread/player/playerglobal/flash/system/ApplicationDomain.js +69 -0
  245. package/dist/thread/player/playerglobal/flash/system/Capabilities.js +163 -0
  246. package/dist/thread/player/playerglobal/flash/system/FSCommandHost.js +17 -0
  247. package/dist/thread/player/playerglobal/flash/system/Security.js +46 -0
  248. package/dist/thread/player/playerglobal/flash/system/SecurityDomain.js +21 -0
  249. package/dist/thread/player/playerglobal/flash/system/System.js +73 -0
  250. package/dist/thread/player/playerglobal/flash/system/Worker.js +112 -0
  251. package/dist/thread/player/playerglobal/flash/text/Font.js +95 -0
  252. package/dist/thread/player/playerglobal/flash/text/StaticText.js +16 -0
  253. package/dist/thread/player/playerglobal/flash/text/StyleSheet.js +65 -0
  254. package/dist/thread/player/playerglobal/flash/text/TextField.js +707 -0
  255. package/dist/thread/player/playerglobal/flash/text/TextRenderer.js +77 -0
  256. package/dist/thread/player/playerglobal/flash/text/engine/FontDescription.js +141 -0
  257. package/dist/thread/player/playerglobal/flash/text/engine/TabStop.js +46 -0
  258. package/dist/thread/player/playerglobal/flash/trace/Trace.js +17 -0
  259. package/dist/thread/player/playerglobal/flash/ui/ContextMenu.js +17 -0
  260. package/dist/thread/player/playerglobal/flash/ui/GameInput.js +19 -0
  261. package/dist/thread/player/playerglobal/flash/ui/Keyboard.js +27 -0
  262. package/dist/thread/player/playerglobal/flash/ui/Mouse.js +127 -0
  263. package/dist/thread/player/playerglobal/flash/ui/Multitouch.js +46 -0
  264. package/dist/thread/player/playerglobal/flash/utils/ByteArray.js +155 -0
  265. package/dist/thread/player/playerglobal/flash/utils/Timer.js +25 -0
  266. package/dist/thread/player/playerglobal/flash/xml/XMLDocument.js +74 -0
  267. package/dist/thread/player/playerglobal/index.js +224 -0
  268. package/dist/thread/player/playerglobal/libraries.js +10 -0
  269. package/dist/thread/player/playerglobal/playerglobal-library.js +22 -0
  270. package/dist/thread/player/playerglobal/toplevel.js +122 -0
  271. package/dist/thread/player/scripting/clipboard.js +146 -0
  272. package/dist/thread/player/scripting/code.js +900 -0
  273. package/dist/thread/player/scripting/evaluate.js +144 -0
  274. package/dist/thread/player/scripting/events.js +172 -0
  275. package/dist/thread/player/scripting/handover.js +182 -0
  276. package/dist/thread/player/scripting/lazy.js +38 -0
  277. package/dist/thread/player/scripting/lifecycle.js +272 -0
  278. package/dist/thread/player/scripting/loads.js +860 -0
  279. package/dist/thread/player/scripting/sha256.js +95 -0
  280. package/dist/thread/player/scripting/symbols.js +348 -0
  281. package/dist/thread/player/scripting/timers.js +434 -0
  282. package/dist/thread/player/scripting/workers.js +923 -0
  283. package/dist/thread/player/scripting.js +1018 -0
  284. package/dist/thread/player/stage.js +4 -0
  285. package/dist/thread/player/text/csm.js +113 -0
  286. package/dist/thread/player/text/css.js +167 -0
  287. package/dist/thread/player/text/fonts.js +97 -0
  288. package/dist/thread/player/text/layout.js +393 -0
  289. package/dist/thread/player/text/static.js +109 -0
  290. package/dist/thread/player/text/text.js +431 -0
  291. package/dist/thread/player/workers/thread.js +159 -0
  292. package/dist/thread/player/workers/wire.js +198 -0
  293. package/dist/thread/player-hosts/web-worker.js +19 -0
  294. package/dist/thread/runtime/avm1/activation.js +89 -0
  295. package/dist/thread/runtime/avm1/case.js +249 -0
  296. package/dist/thread/runtime/avm1/clips.js +334 -0
  297. package/dist/thread/runtime/avm1/control.js +280 -0
  298. package/dist/thread/runtime/avm1/errors.js +50 -0
  299. package/dist/thread/runtime/avm1/functions.js +249 -0
  300. package/dist/thread/runtime/avm1/globals/array.js +549 -0
  301. package/dist/thread/runtime/avm1/globals/broadcaster.js +131 -0
  302. package/dist/thread/runtime/avm1/globals/date.js +436 -0
  303. package/dist/thread/runtime/avm1/globals/global.js +344 -0
  304. package/dist/thread/runtime/avm1/globals/math.js +139 -0
  305. package/dist/thread/runtime/avm1/globals/number.js +93 -0
  306. package/dist/thread/runtime/avm1/globals/string.js +201 -0
  307. package/dist/thread/runtime/avm1/globals/timers.js +129 -0
  308. package/dist/thread/runtime/avm1/host.js +5 -0
  309. package/dist/thread/runtime/avm1/index.js +14 -0
  310. package/dist/thread/runtime/avm1/inheritance.js +132 -0
  311. package/dist/thread/runtime/avm1/numbers.js +298 -0
  312. package/dist/thread/runtime/avm1/objects.js +896 -0
  313. package/dist/thread/runtime/avm1/operators.js +170 -0
  314. package/dist/thread/runtime/avm1/realm.js +529 -0
  315. package/dist/thread/runtime/avm1/runtime.js +882 -0
  316. package/dist/thread/runtime/avm1/scope.js +385 -0
  317. package/dist/thread/runtime/avm1/urls.js +180 -0
  318. package/dist/thread/runtime/avm1/values.js +97 -0
  319. package/dist/thread/runtime/avm2/amf-classes.js +66 -0
  320. package/dist/thread/runtime/avm2/amf.js +801 -0
  321. package/dist/thread/runtime/avm2/array-conversion.js +100 -0
  322. package/dist/thread/runtime/avm2/builtin-library.js +21 -0
  323. package/dist/thread/runtime/avm2/cache-fill.js +86 -0
  324. package/dist/thread/runtime/avm2/classes.js +211 -0
  325. package/dist/thread/runtime/avm2/definitions.js +69 -0
  326. package/dist/thread/runtime/avm2/descriptors.js +5 -0
  327. package/dist/thread/runtime/avm2/dictionary-keys.js +295 -0
  328. package/dist/thread/runtime/avm2/domain-memory.js +75 -0
  329. package/dist/thread/runtime/avm2/domain.js +280 -0
  330. package/dist/thread/runtime/avm2/dynamic-properties.js +182 -0
  331. package/dist/thread/runtime/avm2/enumeration.js +393 -0
  332. package/dist/thread/runtime/avm2/errors.js +45 -0
  333. package/dist/thread/runtime/avm2/float-library.js +66 -0
  334. package/dist/thread/runtime/avm2/float.js +26 -0
  335. package/dist/thread/runtime/avm2/hooks.js +19 -0
  336. package/dist/thread/runtime/avm2/index.js +38 -0
  337. package/dist/thread/runtime/avm2/messages.js +177 -0
  338. package/dist/thread/runtime/avm2/method-factories.js +95 -0
  339. package/dist/thread/runtime/avm2/modules.js +105 -0
  340. package/dist/thread/runtime/avm2/names.js +248 -0
  341. package/dist/thread/runtime/avm2/natives/aliases.js +47 -0
  342. package/dist/thread/runtime/avm2/natives/array.js +390 -0
  343. package/dist/thread/runtime/avm2/natives/bytearray.js +1227 -0
  344. package/dist/thread/runtime/avm2/natives/case.js +88 -0
  345. package/dist/thread/runtime/avm2/natives/concurrent.js +199 -0
  346. package/dist/thread/runtime/avm2/natives/date.js +581 -0
  347. package/dist/thread/runtime/avm2/natives/define.js +130 -0
  348. package/dist/thread/runtime/avm2/natives/describe.js +351 -0
  349. package/dist/thread/runtime/avm2/natives/dictionary.js +12 -0
  350. package/dist/thread/runtime/avm2/natives/float-vector.js +81 -0
  351. package/dist/thread/runtime/avm2/natives/float.js +96 -0
  352. package/dist/thread/runtime/avm2/natives/index.js +64 -0
  353. package/dist/thread/runtime/avm2/natives/json.js +514 -0
  354. package/dist/thread/runtime/avm2/natives/number.js +162 -0
  355. package/dist/thread/runtime/avm2/natives/object.js +237 -0
  356. package/dist/thread/runtime/avm2/natives/proxy.js +75 -0
  357. package/dist/thread/runtime/avm2/natives/regexp.js +485 -0
  358. package/dist/thread/runtime/avm2/natives/shell-workers.js +404 -0
  359. package/dist/thread/runtime/avm2/natives/shell.js +557 -0
  360. package/dist/thread/runtime/avm2/natives/sort.js +377 -0
  361. package/dist/thread/runtime/avm2/natives/string.js +132 -0
  362. package/dist/thread/runtime/avm2/natives/sync.js +821 -0
  363. package/dist/thread/runtime/avm2/natives/toplevel.js +139 -0
  364. package/dist/thread/runtime/avm2/natives/vector-elements.js +46 -0
  365. package/dist/thread/runtime/avm2/natives/vector.js +406 -0
  366. package/dist/thread/runtime/avm2/natives/xml/access.js +633 -0
  367. package/dist/thread/runtime/avm2/natives/xml/build.js +291 -0
  368. package/dist/thread/runtime/avm2/natives/xml/chars.js +112 -0
  369. package/dist/thread/runtime/avm2/natives/xml/escape.js +38 -0
  370. package/dist/thread/runtime/avm2/natives/xml/names.js +204 -0
  371. package/dist/thread/runtime/avm2/natives/xml/node.js +272 -0
  372. package/dist/thread/runtime/avm2/natives/xml/operators.js +69 -0
  373. package/dist/thread/runtime/avm2/natives/xml/parser.js +356 -0
  374. package/dist/thread/runtime/avm2/natives/xml/strings.js +191 -0
  375. package/dist/thread/runtime/avm2/natives/xml/values.js +122 -0
  376. package/dist/thread/runtime/avm2/natives/xml/xml.js +645 -0
  377. package/dist/thread/runtime/avm2/number-strings.js +110 -0
  378. package/dist/thread/runtime/avm2/numbers.js +558 -0
  379. package/dist/thread/runtime/avm2/options.js +16 -0
  380. package/dist/thread/runtime/avm2/player-messages.js +550 -0
  381. package/dist/thread/runtime/avm2/property-cache.js +135 -0
  382. package/dist/thread/runtime/avm2/runtime.js +2644 -0
  383. package/dist/thread/runtime/avm2/traits.js +509 -0
  384. package/dist/thread/runtime/index.js +7 -0
  385. package/dist/web-worker.d.ts +2 -0
  386. package/dist/web-worker.d.ts.map +1 -0
  387. package/dist/web-worker.js +20 -0
  388. package/dist/web-worker.js.map +1 -0
  389. package/dist/websocket.d.ts +4 -0
  390. package/dist/websocket.d.ts.map +1 -0
  391. package/dist/websocket.js +27 -0
  392. package/dist/websocket.js.map +1 -0
  393. package/dist/workers.d.ts +35 -0
  394. package/dist/workers.d.ts.map +1 -0
  395. package/dist/workers.js +171 -0
  396. package/dist/workers.js.map +1 -0
  397. package/package.json +62 -3
  398. package/src/indexeddb.ts +227 -0
  399. package/src/node-worker.ts +13 -0
  400. package/src/node.ts +49 -0
  401. package/src/precompiled.ts +166 -0
  402. package/src/stage3d.ts +76 -0
  403. package/src/web-worker.ts +24 -0
  404. package/src/websocket.ts +32 -0
  405. package/src/workers.ts +255 -0
@@ -0,0 +1,352 @@
1
+ // What an AVM1 load brings, made ready before the frame that delivers it:
2
+ // a SWF read, its library's images decoded, or an image file's pixels,
3
+ // sniffed by their bytes and not by the URL, as Ruffle's
4
+ // (https://github.com/ruffle-rs/ruffle) core/src/loader.rs
5
+ // (ContentType::sniff, movie_loader_data) has it: MIT OR Apache-2.0,
6
+ // Copyright (c) 2018-2022 Ruffle LLC and Ruffle contributors.
7
+ //
8
+ // AVM1 plays what it loads as AVM1, an ActionScript 3 SWF too: its
9
+ // timeline plays and none of its code runs, as Ruffle forces such a SWF
10
+ // to AVM1 (docs/avm1.md, "Loading movies").
11
+ //
12
+ // MovieLoads keeps loadMovie's and MovieClipLoader's loads from when they
13
+ // are asked until they are done with: each arrives between frames in the
14
+ // order asked, unloads what its clip showed and fills it, telling the
15
+ // loader's listeners as it goes.
16
+ import { readSwf } from "../../format/index.js";
17
+ import { avm1 } from "../../runtime/index.js";
18
+ import { BitmapStore } from "../bitmap/bitmap.js";
19
+ import { decodeImageFile, decodeImages, imageFormat } from "../bitmap/images.js";
20
+ import { BitmapObject, EMPTY_TIMELINE, MovieClip } from "../display/display.js";
21
+ import { readLibrary, } from "../display/timeline.js";
22
+ import { resolve } from "../scripting/loads.js";
23
+ import { formRequest } from "./globals/LoadVars.js";
24
+ import { textFor } from "./net.js";
25
+ import { CALL, NO_BLOCKS, NORMAL, Queued } from "./queue.js";
26
+ import { Avm1Swf, readRootFrames } from "./swf.js";
27
+ /** What `result`'s bytes are, read and decoded as far as a frame needs them. */
28
+ async function arrive(result, decode) {
29
+ const bytes = result.bytes;
30
+ const status = result.status;
31
+ if (bytes === null) {
32
+ return { type: "failed", status };
33
+ }
34
+ const format = imageFormat(bytes);
35
+ if (format !== null) {
36
+ const pixels = await decodeImageFile(bytes, format, decode);
37
+ return { type: "image", pixels, size: bytes.length, status };
38
+ }
39
+ const signature = String.fromCharCode(bytes[0], bytes[1], bytes[2]);
40
+ if (signature !== "FWS" && signature !== "CWS" && signature !== "ZWS") {
41
+ return { type: "unknown", status };
42
+ }
43
+ let swf;
44
+ let library;
45
+ try {
46
+ swf = readSwf(bytes);
47
+ library = readLibrary(swf);
48
+ }
49
+ catch {
50
+ return { type: "unknown", status };
51
+ }
52
+ await decodeImages(library, decode);
53
+ return { type: "swf", swf, library, size: bytes.length, status };
54
+ }
55
+ /**
56
+ * A URL's query as a loaded SWF's root gets it, each name a variable, as
57
+ * Ruffle's movie_loader_complete defines a movie's parameters: decoded,
58
+ * `+` a space, a name without `=` an empty value.
59
+ */
60
+ function queryVariables(url) {
61
+ const path = url.split("#", 1)[0];
62
+ const at = path.indexOf("?");
63
+ if (at < 0) {
64
+ return [];
65
+ }
66
+ return [...new URLSearchParams(path.slice(at + 1))];
67
+ }
68
+ /** What a load replaced or cancelled before it was read brings: nothing it reads. */
69
+ const SKIPPED = { type: "failed", status: 0 };
70
+ /** The longest a load waits for the one asked before it, in ms, to arrive in their order. */
71
+ const ORDER_WAIT = 2000;
72
+ /** `previous` settled, or `ms` passed, whichever comes first. */
73
+ function within(previous, ms) {
74
+ let timer;
75
+ const passed = new Promise((resolve) => {
76
+ timer = setTimeout(resolve, ms);
77
+ });
78
+ return Promise.race([previous, passed]).finally(() => clearTimeout(timer));
79
+ }
80
+ /** What a clip unloaded or in error shows: no frames, which it never enters. */
81
+ const NO_FRAMES = { ...EMPTY_TIMELINE, frames: [] };
82
+ /** loadMovie's and MovieClipLoader's loads, which the movie owns. */
83
+ export class MovieLoads {
84
+ movie;
85
+ decodeImage;
86
+ /** The loads asked, in order, until they are done with. */
87
+ movieLoads = [];
88
+ /**
89
+ * The last load's arrival, nothing, into each clip and by each
90
+ * MovieClipLoader, which the next one's waits for: they arrive in the
91
+ * order asked.
92
+ */
93
+ arrivals = new WeakMap();
94
+ constructor(movie, decodeImage) {
95
+ this.movie = movie;
96
+ this.decodeImage = decodeImage;
97
+ }
98
+ /**
99
+ * loadMovie and loadMovieNum: the SWF or image at `url` into a clip, or
100
+ * into a level, which the load makes where there is none; an empty URL
101
+ * unloads what is there.
102
+ */
103
+ loadMovie(into, url, form) {
104
+ if (typeof into === "number") {
105
+ const level = this.movie.level(into);
106
+ if (url !== "") {
107
+ this.startLoad(level ?? this.movie.levelToLoad(into), url, form, null);
108
+ }
109
+ else if (level !== null) {
110
+ this.unloadMovie(level);
111
+ }
112
+ }
113
+ else if (into instanceof MovieClip) {
114
+ if (url !== "") {
115
+ this.startLoad(into, url, form, null);
116
+ }
117
+ else {
118
+ this.unloadMovie(into);
119
+ }
120
+ }
121
+ }
122
+ /**
123
+ * MovieClipLoader.loadClip: the SWF or image at `url` into `target`,
124
+ * `loader`'s listeners told of it; false for a target that is no clip.
125
+ */
126
+ loadClip(loader, target, url) {
127
+ if (!(target instanceof MovieClip)) {
128
+ return false;
129
+ }
130
+ this.startLoad(target, url, null, loader);
131
+ return true;
132
+ }
133
+ /**
134
+ * A load into `target` asked: the request goes now, and what it brings,
135
+ * read and its code compiled, arrives between frames, each load in the
136
+ * order asked, as Ruffle's test runner has them arrive; one whose answer
137
+ * is slow to come holds those after it a while at most.
138
+ */
139
+ startLoad(target, url, form, loader) {
140
+ // A load into a clip that another is under way into replaces it, which tells nothing.
141
+ for (const earlier of this.movieLoads) {
142
+ if (earlier.target === target && earlier.status === "pending") {
143
+ earlier.status = "done";
144
+ }
145
+ }
146
+ const request = form === null
147
+ ? { url, method: "GET", headers: [], body: null }
148
+ : formRequest(url, form.method, form.vars);
149
+ const load = {
150
+ target,
151
+ loader,
152
+ url: resolve(this.movie.url, url),
153
+ status: "pending",
154
+ };
155
+ this.movieLoads.push(load);
156
+ const arrival = this.movie.net
157
+ .request(request, "content")
158
+ .then(async (result) => {
159
+ // One replaced or cancelled meanwhile is not read, nor its code compiled.
160
+ if (load.status !== "pending") {
161
+ return SKIPPED;
162
+ }
163
+ // What came is the final URL's: a redirect to another origin must not pass as the one asked for.
164
+ if (result.url) {
165
+ load.url = result.url;
166
+ }
167
+ const a = await arrive(result, this.decodeImage);
168
+ if (a.type !== "swf") {
169
+ return a;
170
+ }
171
+ if (load.status !== "pending") {
172
+ return SKIPPED;
173
+ }
174
+ return { ...a, blocks: await this.movie.compile(a.swf, a.library.actions ?? null) };
175
+ })
176
+ .catch(() => ({ type: "unknown", status: 0 }));
177
+ // After the loads asked before it into the same clip or by the same loader, which
178
+ // are kept by what they settle to, nothing, not by what they brought.
179
+ const keys = loader === null ? [target] : [target, loader];
180
+ const previous = Promise.all(keys.map((key) => this.arrivals.get(key)));
181
+ const ordered = within(previous, ORDER_WAIT).then(() => arrival);
182
+ const settled = ordered.then(() => { });
183
+ for (const key of keys) {
184
+ this.arrivals.set(key, settled);
185
+ }
186
+ this.movie.net.after(ordered, (arrived) => this.arrived(load, arrived));
187
+ }
188
+ /**
189
+ * A load's bytes arrived, between frames: as Ruffle's movie_loader has
190
+ * it, what the clip showed unloads, its variables go, and onLoadStart;
191
+ * then the SWF or image takes its place, or an empty one where the bytes
192
+ * are neither, with onLoadProgress and onLoadComplete, or onLoadError
193
+ * where nothing came. A clip removed meanwhile takes nothing, and
194
+ * nothing is told; one a listener removes or unloads is told no more.
195
+ */
196
+ arrived(load, arrived) {
197
+ const target = load.target;
198
+ const face = target.avm1 ?? undefined;
199
+ const over = () => load.status !== "pending" || this.movie.removed(target);
200
+ // Told, and whether the load goes on.
201
+ const told = (name, args) => {
202
+ this.tell(load, name, args);
203
+ return !over();
204
+ };
205
+ if (over()) {
206
+ // One an unload cancelled still starts, and no more (the corpus's load_cancel_*).
207
+ if (load.status === "cancelled" && !this.movie.removed(target)) {
208
+ this.tell(load, "onLoadStart", [face]);
209
+ }
210
+ load.status = "done";
211
+ return;
212
+ }
213
+ const version = this.movie.swfOf(target).version;
214
+ this.movie.unload(target);
215
+ if (face !== undefined) {
216
+ for (const p of [...face.ownProperties()]) {
217
+ if ((p.flags & avm1.DONT_DELETE) === 0) {
218
+ face.remove(p);
219
+ }
220
+ }
221
+ }
222
+ this.movie.fill(target, new Avm1Swf(null, null, version, load.url, 0));
223
+ if (!told("onLoadStart", [face])) {
224
+ load.status = "done";
225
+ return;
226
+ }
227
+ // Flash's error state: no frames, none loaded, no version, and -1 bytes (the corpus's
228
+ // movieclip_state_values).
229
+ const error = () => this.movie.fill(target, new Avm1Swf(null, null, 0, load.url, -1), NO_FRAMES);
230
+ let going = true;
231
+ switch (arrived.type) {
232
+ case "failed":
233
+ error();
234
+ load.status = "done";
235
+ this.tell(load, "onLoadError", [face, "URLNotFound", arrived.status]);
236
+ return;
237
+ case "unknown":
238
+ error();
239
+ going = told("onLoadProgress", [face, 0, 0]);
240
+ break;
241
+ case "image": {
242
+ // An image is a movie of no version, its one frame the image at depth 1.
243
+ const swf = new Avm1Swf(null, null, 0, load.url, arrived.size);
244
+ this.movie.fill(target, swf);
245
+ if (arrived.pixels !== null) {
246
+ target.placeAtDepth(new BitmapObject(BitmapStore.of(arrived.pixels)), 1);
247
+ }
248
+ going = told("onLoadProgress", [face, arrived.size, arrived.size]);
249
+ break;
250
+ }
251
+ case "swf": {
252
+ const { swf: file, library, size } = arrived;
253
+ const swf = new Avm1Swf(library, library.actions ?? null, file.header.version, load.url, file.header.fileLength, size);
254
+ swf.blocks = arrived.blocks;
255
+ this.movie.external.ownCode(swf);
256
+ this.movie.adopt(swf);
257
+ readRootFrames(file, swf);
258
+ this.movie.fill(target, swf);
259
+ // The URL's query as the root's variables, as a movie's parameters.
260
+ if (face !== undefined) {
261
+ for (const [name, value] of queryVariables(load.url)) {
262
+ face.define(name, textFor(value, swf.version), 0);
263
+ }
264
+ }
265
+ // Ruffle tells a load into level 0 twice.
266
+ going =
267
+ (target !== this.movie.root || told("onLoadProgress", [face, size, size])) &&
268
+ told("onLoadProgress", [face, size, size]);
269
+ break;
270
+ }
271
+ }
272
+ if (!going) {
273
+ load.status = "done";
274
+ return;
275
+ }
276
+ load.status = "loaded";
277
+ this.tell(load, "onLoadComplete", [face, arrived.status]);
278
+ // No onLoadInit for one a listener removed or unloaded.
279
+ if (this.movie.removed(target)) {
280
+ load.status = "done";
281
+ }
282
+ }
283
+ /**
284
+ * `load`'s loader's listeners told `name`, through its broadcastMessage,
285
+ * as a script would call it.
286
+ */
287
+ tell(load, name, args) {
288
+ if (load.loader !== null && !this.movie.halted) {
289
+ this.movie.callback(load.loader, "broadcastMessage", [name, ...args]);
290
+ }
291
+ }
292
+ /**
293
+ * Each load that has arrived done with: one that loaded has its
294
+ * loader's onLoadInit queued, after the frame's actions of what it
295
+ * loaded, the latest load's first (Ruffle's movie_clip_on_load).
296
+ */
297
+ loadsInitialized() {
298
+ for (let i = this.movieLoads.length - 1; i >= 0; i--) {
299
+ const load = this.movieLoads[i];
300
+ if (load.status === "pending") {
301
+ continue;
302
+ }
303
+ this.movieLoads.splice(i, 1);
304
+ if (load.status === "loaded" && load.loader !== null) {
305
+ this.movie.queue.enqueue(NORMAL, new Queued(CALL, this.movie.root, null, 0, 0, false, "broadcastMessage", NO_BLOCKS, load.loader, ["onLoadInit", load.target.avm1 ?? undefined]));
306
+ }
307
+ }
308
+ }
309
+ /**
310
+ * unloadMovie: what `d` shows unloaded, its unload events, and it left
311
+ * empty, as an empty movie of its parent's SWF; a level's or a loaded
312
+ * movie's root's between frames, a frame later, as Ruffle's
313
+ * avm1_unload_movie has them. A load into it under way is cancelled: it
314
+ * tells of its start as it arrives, and no more.
315
+ */
316
+ unloadMovie(d) {
317
+ if (!(d instanceof MovieClip)) {
318
+ return;
319
+ }
320
+ // One under way tells of its start as it arrives; one arrived has no onLoadInit.
321
+ for (const load of this.movieLoads) {
322
+ if (load.target === d && load.status === "pending") {
323
+ load.status = "cancelled";
324
+ }
325
+ else if (load.target === d && load.status === "loaded") {
326
+ load.status = "done";
327
+ }
328
+ }
329
+ if (this.movie.levelOf(d) !== null || this.movie.contents.has(d)) {
330
+ this.movie.net.after(Promise.resolve(), () => this.unloaded(d));
331
+ }
332
+ else {
333
+ this.unloaded(d);
334
+ }
335
+ }
336
+ /** `d` unloaded and left empty. */
337
+ unloaded(d) {
338
+ if (this.movie.removed(d)) {
339
+ return;
340
+ }
341
+ const parent = this.movie.levelOf(d) !== null ? null : d.parent;
342
+ const swf = parent === null ? this.movie.swfOf(d) : this.movie.swfOf(parent);
343
+ // The movie it played goes with it, and what codegen keeps of it: compiling its units again
344
+ // copies it in again.
345
+ const unloading = this.movie.swfOf(d);
346
+ if (unloading.root === d) {
347
+ this.movie.releaseCode(unloading);
348
+ }
349
+ this.movie.unload(d);
350
+ this.movie.fill(d, new Avm1Swf(null, null, swf.version, parent === null ? "" : swf.url, 0), NO_FRAMES);
351
+ }
352
+ }
@@ -0,0 +1,219 @@
1
+ import { resolve } from "../scripting/loads.js";
2
+ const FAILED = { bytes: null, status: 0, headers: [] };
3
+ const encoder = new TextEncoder();
4
+ /**
5
+ * Text from the network as a SWF of `version` holds it: up to SWF 5 a
6
+ * string is bytes, a character each (the runtime's), here its UTF-8's.
7
+ */
8
+ export function textFor(text, version) {
9
+ if (version > 5 || !/[^ -~\t\n\r]/.test(text)) {
10
+ return text;
11
+ }
12
+ const bytes = encoder.encode(text);
13
+ const parts = [];
14
+ for (let i = 0; i < bytes.length; i += 0x2000) {
15
+ parts.push(String.fromCharCode(...bytes.subarray(i, i + 0x2000)));
16
+ }
17
+ return parts.join("");
18
+ }
19
+ /** A string as the bytes it sends: up to SWF 5 its own bytes (UTF-8 past 0xFF), later its UTF-8. */
20
+ export function bytesFor(text, version) {
21
+ if (version > 5) {
22
+ return encoder.encode(text);
23
+ }
24
+ const bytes = [];
25
+ for (const c of text) {
26
+ const code = c.codePointAt(0);
27
+ if (code <= 0xff) {
28
+ bytes.push(code);
29
+ }
30
+ else {
31
+ bytes.push(...encoder.encode(c));
32
+ }
33
+ }
34
+ return Uint8Array.from(bytes);
35
+ }
36
+ export class Avm1Net {
37
+ fetchHost;
38
+ socketHost;
39
+ base;
40
+ sends;
41
+ /** Host callbacks held for the next frame, in the order they came. */
42
+ ready = [];
43
+ pending = new Set();
44
+ stopped = new AbortController();
45
+ /** The connections open, for destroy to close. */
46
+ connections = new Set();
47
+ destroyed = false;
48
+ constructor(fetchHost, socketHost,
49
+ /** Where relative URLs resolve: the page's base where it gives one, else the SWF's URL. */
50
+ base,
51
+ /** Whether a send without a window goes, as allowNetworking "internal" or "none" has it not. */
52
+ sends = true) {
53
+ this.fetchHost = fetchHost;
54
+ this.socketHost = socketHost;
55
+ this.base = base;
56
+ this.sends = sends;
57
+ }
58
+ /** `url` as the request goes out: against the base, as a load's URL resolves in AS3. */
59
+ resolve(url) {
60
+ return resolve(this.base, url);
61
+ }
62
+ /**
63
+ * `request` sent by the host's fetch, as "data", which the host judges
64
+ * as it judges a URLLoader's; `deliver` gets the result in a frame
65
+ * after, a failure as no bytes, status 0, where nothing answered.
66
+ */
67
+ fetch(request, deliver) {
68
+ this.after(this.request(request, "data"), deliver);
69
+ }
70
+ /**
71
+ * `request` sent by the host's fetch, as `purpose`: its result, a
72
+ * failure as no bytes, status 0, where nothing answered. A movie's load
73
+ * is "content", as AS3's Loader's is.
74
+ */
75
+ request(request, purpose, signal) {
76
+ const fetch = this.fetchHost;
77
+ if (this.destroyed) {
78
+ return Promise.resolve(FAILED);
79
+ }
80
+ const outgoing = { ...request, url: this.resolve(request.url), purpose };
81
+ return (fetch
82
+ ? fetch(outgoing, signal ? AbortSignal.any([signal, this.stopped.signal]) : this.stopped.signal)
83
+ : Promise.reject()).then((result) => result, () => FAILED);
84
+ }
85
+ /**
86
+ * `task`'s value delivered to `deliver` in a frame after it settles;
87
+ * nothing for one that fails.
88
+ */
89
+ after(task, deliver) {
90
+ this.track(task.then((value) => this.defer(() => deliver(value)), () => { }));
91
+ }
92
+ /**
93
+ * `request` sent and its answer dropped, as a send without a window is,
94
+ * as AS3's sendToURL is: whether it went, which allowNetworking
95
+ * "internal" refuses as it refuses sendToURL.
96
+ */
97
+ send(request) {
98
+ if (!this.sends || this.destroyed) {
99
+ return false;
100
+ }
101
+ this.fetchHost?.({ ...request, url: this.resolve(request.url), purpose: "send" }, this.stopped.signal).catch(() => { });
102
+ return true;
103
+ }
104
+ /**
105
+ * A connection to `host` and `port` through the host's sockets, its
106
+ * events held for the next frame; null where there are none, or the host
107
+ * refused at once, which `refused` is then called for in a frame after.
108
+ * One that has not opened `timeout` ms on (none for 0) is closed, and
109
+ * fails as a refused one does, as XMLSocket.timeout has it.
110
+ */
111
+ connect(host, port, events, refused, timeout = 0) {
112
+ const sockets = this.socketHost;
113
+ if (sockets === null || this.destroyed) {
114
+ this.defer(refused);
115
+ return null;
116
+ }
117
+ let transport = null;
118
+ let timer = null;
119
+ let opened = false;
120
+ let ended = false;
121
+ const stopTimer = () => {
122
+ if (timer !== null) {
123
+ clearTimeout(timer);
124
+ timer = null;
125
+ }
126
+ };
127
+ // Closed or failed, by either end or the timeout: forgotten, and the timeout has nothing to do.
128
+ const end = () => {
129
+ ended = true;
130
+ stopTimer();
131
+ if (transport !== null) {
132
+ this.connections.delete(transport);
133
+ }
134
+ };
135
+ try {
136
+ transport = sockets.connect(host, port, {
137
+ open: (endpoints) => {
138
+ opened = true;
139
+ stopTimer();
140
+ this.defer(() => events.open(endpoints));
141
+ },
142
+ data: (bytes) => {
143
+ const copy = bytes.slice();
144
+ this.defer(() => events.data(copy));
145
+ },
146
+ close: () => {
147
+ end();
148
+ this.defer(() => events.close());
149
+ },
150
+ error: (message) => {
151
+ end();
152
+ this.defer(() => events.error(message));
153
+ },
154
+ });
155
+ }
156
+ catch {
157
+ this.defer(refused);
158
+ return null;
159
+ }
160
+ if (ended) {
161
+ return transport;
162
+ }
163
+ this.connections.add(transport);
164
+ if (!opened && timeout > 0) {
165
+ const opening = transport;
166
+ timer = setTimeout(() => {
167
+ timer = null;
168
+ // Closed by the script, or the player gone, meanwhile: nothing to time out.
169
+ if (opened || ended || !this.connections.has(opening)) {
170
+ return;
171
+ }
172
+ end();
173
+ opening.close();
174
+ this.defer(() => events.error("timeout"));
175
+ }, timeout);
176
+ }
177
+ return transport;
178
+ }
179
+ /** A connection the script closed: destroy need not close it. */
180
+ closed(transport) {
181
+ this.connections.delete(transport);
182
+ transport.close();
183
+ }
184
+ /** The callbacks the host has made since the last call, to deliver now. */
185
+ take() {
186
+ const ready = this.ready;
187
+ this.ready = [];
188
+ return ready;
189
+ }
190
+ /** Resolves once every request so far has come back, and is held for the next frame. */
191
+ settled() {
192
+ return Promise.all([...this.pending]).then(() => { });
193
+ }
194
+ /**
195
+ * The player gone, or its SWF stopped for good: the fetches under way are
196
+ * aborted, the connections closed, and nothing more is held.
197
+ */
198
+ destroy() {
199
+ if (this.destroyed) {
200
+ return;
201
+ }
202
+ this.destroyed = true;
203
+ this.ready = [];
204
+ this.stopped.abort();
205
+ for (const transport of [...this.connections]) {
206
+ this.connections.delete(transport);
207
+ transport.close();
208
+ }
209
+ }
210
+ defer(event) {
211
+ if (!this.destroyed) {
212
+ this.ready.push(event);
213
+ }
214
+ }
215
+ track(task) {
216
+ this.pending.add(task);
217
+ void task.then(() => this.pending.delete(task));
218
+ }
219
+ }
@@ -0,0 +1,104 @@
1
+ // AVM1's names for display objects, as Ruffle's
2
+ // (https://github.com/ruffle-rs/ruffle) core/src/display_object.rs (path,
3
+ // slash_path, avm1_parent) and container.rs (child_by_name) have them: MIT
4
+ // OR Apache-2.0, Copyright (c) 2018-2022 Ruffle LLC and Ruffle
5
+ // contributors. Where adl parts from Ruffle, adl decides (docs/avm1.md,
6
+ // "Clips and paths").
7
+ import { avm1 } from "../../runtime/index.js";
8
+ import { Container } from "../display/display.js";
9
+ /** ASCII's lower case, as Flash compares instance names and frame labels without case. */
10
+ export function asciiLower(s) {
11
+ // A loop and not a regular expression's test, which allocates: clips' display properties are looked up so.
12
+ for (let i = 0; i < s.length; i++) {
13
+ const c = s.charCodeAt(i);
14
+ if (c >= 0x41 && c <= 0x5a) {
15
+ return s.replace(/[A-Z]/g, (u) => String.fromCharCode(u.charCodeAt(0) + 32));
16
+ }
17
+ }
18
+ return s;
19
+ }
20
+ /**
21
+ * The dot path of `d`, `_level0.a.b`, as a clip converts to a string and
22
+ * TargetPath gives it: from its level, or from level 0 for one off the
23
+ * display list.
24
+ */
25
+ export function pathOf(d, levelOf) {
26
+ const names = [];
27
+ let level = 0;
28
+ for (let o = d; o !== null; o = o.parent) {
29
+ const n = levelOf(o);
30
+ if (n !== null) {
31
+ level = n;
32
+ break;
33
+ }
34
+ names.push(o.name);
35
+ }
36
+ names.push(`_level${level}`);
37
+ return names.reverse().join(".");
38
+ }
39
+ /**
40
+ * The slash path of `d`, `_target`'s: "/" for a level, `/a/b` below level
41
+ * 0 and `_level1/a/b` below another, as Ruffle's slash_path has it.
42
+ */
43
+ export function slashPathOf(d, levelOf) {
44
+ if (levelOf(d) !== null) {
45
+ return "/";
46
+ }
47
+ const names = [];
48
+ let level = 0;
49
+ for (let o = d; o !== null; o = o.parent) {
50
+ const n = levelOf(o);
51
+ if (n !== null) {
52
+ level = n;
53
+ break;
54
+ }
55
+ names.push(o.name);
56
+ }
57
+ return `${level === 0 ? "" : `_level${level}`}/${names.reverse().join("/")}`;
58
+ }
59
+ /**
60
+ * The child of `d` named `name`, the lowest in depth of those that are, in
61
+ * its case or, up to SWF 6, folded as Flash folds names (the corpus's
62
+ * `swf6_case_insensitive`).
63
+ */
64
+ export function childByName(d, name, caseSensitive) {
65
+ if (!(d instanceof Container)) {
66
+ return null;
67
+ }
68
+ // An object without a name, a shape's, has none to find it by. Folding
69
+ // keeps a name's length, so a name of another length is passed by
70
+ // unfolded: `_x` read on a clip asks each of its children.
71
+ const key = caseSensitive ? name : avm1.fold(name);
72
+ for (const child of d.children) {
73
+ const n = child.name;
74
+ if (n.length === key.length && n !== "" && (caseSensitive ? n : avm1.fold(n)) === key) {
75
+ return child;
76
+ }
77
+ }
78
+ return null;
79
+ }
80
+ /**
81
+ * The display object at a dot path, `_level0.a.b`, as a clip's reference
82
+ * finds it again: names from the level, each a child. Null where none is.
83
+ */
84
+ export function atPath(path, level, caseSensitive) {
85
+ const parts = path.split(".");
86
+ const match = /^_level(-?\d+)$/.exec(parts[0]);
87
+ if (match === null) {
88
+ return null;
89
+ }
90
+ let d = level(Number(match[1]));
91
+ for (let i = 1; i < parts.length && d !== null; i++) {
92
+ d = childByName(d, parts[i], caseSensitive);
93
+ }
94
+ return d;
95
+ }
96
+ /** Whether `d` is on `root`'s display list, the root itself included. */
97
+ export function under(d, root) {
98
+ for (let o = d; o !== null; o = o.parent) {
99
+ if (o === root) {
100
+ return true;
101
+ }
102
+ }
103
+ return false;
104
+ }