@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,557 @@
1
+ // avmshell's own classes, which a player has not: its System, File and
2
+ // Domain, and its Worker and WorkerDomain, whose workers run on threads
3
+ // the host starts (RuntimeOptions.workers; shell-workers.ts).
4
+ import { Reader, Writer } from "../amf.js";
5
+ import { setStaticVar } from "../traits.js";
6
+ import { byteArrayCapacity, bytesOf, fromUtf8, GLOBAL_MEMORY_MIN_SIZE, knownSharedByteArray, setDomainMemory, sharedByteArray, utf8, } from "./bytearray.js";
7
+ import { syncObject, syncOf, syncRef } from "./concurrent.js";
8
+ import { elements, registerNativeClass } from "./define.js";
9
+ import { CANSTART, entryKey, FAILED, ITEM_AMF, ITEM_BYTES, ITEM_NUMBER, ITEM_SHARED, ITEM_SYNC, NEW, newWorkersMemory, RUNNING, STATE_NAMES, sleep, Workers, WorkerTerminated, } from "./shell-workers.js";
10
+ const started = Date.now();
11
+ /** System.getFeatures as the oracle's avmshell gives it. */
12
+ const SHELL_FEATURES = [
13
+ "AVMSYSTEM_32BIT",
14
+ "AVMSYSTEM_UNALIGNED_INT_ACCESS",
15
+ "AVMSYSTEM_UNALIGNED_FP_ACCESS",
16
+ "AVMSYSTEM_LITTLE_ENDIAN",
17
+ "AVMSYSTEM_IA32",
18
+ "AVMSYSTEM_UNIX",
19
+ "AVMFEATURE_JIT",
20
+ "AVMFEATURE_ALCHEMY_POSIX",
21
+ "AVMFEATURE_COMPILEPOLICY",
22
+ "AVMFEATURE_ABC_INTERP",
23
+ "AVMFEATURE_SELFTEST",
24
+ "AVMFEATURE_EVAL",
25
+ "AVMFEATURE_PROTECT_JITMEM",
26
+ "AVMFEATURE_SHARED_GCHEAP",
27
+ "AVMFEATURE_CACHE_GQCN",
28
+ "AVMFEATURE_SAFEPOINTS",
29
+ "AVMFEATURE_INTERRUPT_SAFEPOINT_POLL",
30
+ "AVMFEATURE_SWF12",
31
+ "AVMFEATURE_SWF13",
32
+ "AVMFEATURE_SWF14",
33
+ "AVMFEATURE_SWF15",
34
+ "AVMFEATURE_SWF16",
35
+ "AVMFEATURE_SWF17",
36
+ "AVMFEATURE_SWF18",
37
+ "AVMTWEAK_EXACT_TRACING",
38
+ ]
39
+ .map((f) => `${f};`)
40
+ .join("");
41
+ /** The SWF versions avmplus' BugCompatibility names, which Domain.loadBytes takes. */
42
+ const SWF_VERSIONS = { first: 9, last: 31 };
43
+ /** As FileClass::read: UTF-16 after its byte order mark, else UTF-8, not strict. */
44
+ function decodeText(bytes) {
45
+ if (bytes.length >= 3) {
46
+ if (bytes[0] === 0xef && bytes[1] === 0xbb && bytes[2] === 0xbf) {
47
+ return fromUtf8(bytes.subarray(3));
48
+ }
49
+ const big = bytes[0] === 0xfe && bytes[1] === 0xff;
50
+ if (big || (bytes[0] === 0xff && bytes[1] === 0xfe)) {
51
+ const units = [];
52
+ for (let i = 2; i + 1 < bytes.length; i += 2) {
53
+ const unit = big ? (bytes[i] << 8) | bytes[i + 1] : bytes[i] | (bytes[i + 1] << 8);
54
+ units.push(String.fromCharCode(unit));
55
+ }
56
+ return units.join("");
57
+ }
58
+ }
59
+ return fromUtf8(bytes);
60
+ }
61
+ /** System.totalMemory, freeMemory and privateMemory as the oracle's avmshell starts with them. */
62
+ const START_TOTAL_MEMORY = 1347584;
63
+ const START_FREE_MEMORY = 753664;
64
+ const START_PRIVATE_MEMORY = 6557696;
65
+ /** avmshell's System, File and Domain natives, for `rt`, and its Worker's. */
66
+ export function shellNatives(rt) {
67
+ const natives = {};
68
+ const fileName = (name) => {
69
+ if (name === null || name === undefined) {
70
+ throw rt.error("ArgumentError", 1507, "filename");
71
+ }
72
+ return rt.toString(name);
73
+ };
74
+ const readFile = (name) => {
75
+ const bytes = rt.files.read(name);
76
+ if (bytes === null) {
77
+ throw rt.error("Error", 1500, name);
78
+ }
79
+ return bytes;
80
+ };
81
+ const writeFile = (name, bytes) => {
82
+ if (!rt.files.write(name, bytes)) {
83
+ throw rt.error("Error", 1501, name);
84
+ }
85
+ };
86
+ class SystemNatives {
87
+ // avmshell's console skips NUL characters, which strings may hold.
88
+ static trace(args) {
89
+ rt.print(elements(args)
90
+ .map((v) => rt.toString(v))
91
+ .join(" ")
92
+ .replaceAll("\0", ""));
93
+ }
94
+ static write(s) {
95
+ rt.print(rt.toString(s).replaceAll("\0", ""));
96
+ }
97
+ static "avmplus:System::getArgv"() {
98
+ return rt.array([]);
99
+ }
100
+ static getAvmplusVersion() {
101
+ return "swf2es";
102
+ }
103
+ static get swfVersion() {
104
+ return rt.swfVersion;
105
+ }
106
+ static get apiVersion() {
107
+ return rt.apiVersion;
108
+ }
109
+ static getTimer() {
110
+ return Date.now() - started;
111
+ }
112
+ static getRunmode() {
113
+ return "jit";
114
+ }
115
+ static isDebugger() {
116
+ return rt.debugger;
117
+ }
118
+ static exit() { }
119
+ // A terminated worker's code stops in a sleep, as avmplus interrupts it there.
120
+ static sleep(ms) {
121
+ const { workers } = workersOf(rt);
122
+ const stopped = () => {
123
+ if (workers.terminated) {
124
+ throw new WorkerTerminated();
125
+ }
126
+ };
127
+ stopped();
128
+ for (let left = rt.toInt(ms); left > 0; left -= SLEEP_STEP) {
129
+ sleep(Math.min(left, SLEEP_STEP));
130
+ stopped();
131
+ }
132
+ }
133
+ // There is no shell to run a command in: system()'s -1, of no process made.
134
+ static exec(command) {
135
+ if (command === null || command === undefined) {
136
+ throw rt.error("ArgumentError", 1507, "command");
137
+ }
138
+ return -1;
139
+ }
140
+ // A number's one representation: avmplus' makes a double that is an int one.
141
+ static canonicalizeNumber(a) {
142
+ return a;
143
+ }
144
+ static isGlobal(o) {
145
+ return o !== null && typeof o === "object" && rt.traitsOf(o).isGlobal;
146
+ }
147
+ // The oracle's avmshell's, which swf2es stands in for: 32-bit, as its
148
+ // ByteArrays are limited (kMaxCapacity in bytearray.ts).
149
+ static getFeatures() {
150
+ return SHELL_FEATURES;
151
+ }
152
+ // JavaScript's collector decides when to collect.
153
+ static forceFullCollection() { }
154
+ static queueCollection() { }
155
+ static pauseForGCIfCollectionImminent(_imminence) { }
156
+ // The oracle's avmshell's memory when it starts, which JavaScript does
157
+ // not tell, and as in avmshell, the ByteArrays' capacity.
158
+ static get totalMemory() {
159
+ return START_TOTAL_MEMORY + byteArrayCapacity(rt);
160
+ }
161
+ static get freeMemory() {
162
+ return START_FREE_MEMORY;
163
+ }
164
+ static get privateMemory() {
165
+ return START_PRIVATE_MEMORY + byteArrayCapacity(rt);
166
+ }
167
+ }
168
+ // The files are the runtime's (RuntimeOptions.files), in avmshell's
169
+ // working directory.
170
+ class FileNatives {
171
+ static exists(filename) {
172
+ return rt.files.read(fileName(filename)) !== null;
173
+ }
174
+ static read(filename) {
175
+ return decodeText(readFile(fileName(filename)));
176
+ }
177
+ static write(filename, data) {
178
+ const name = fileName(filename);
179
+ if (data === null || data === undefined) {
180
+ throw rt.error("ArgumentError", 1507, "data");
181
+ }
182
+ writeFile(name, utf8(rt.toString(data)));
183
+ }
184
+ static readByteArray(filename) {
185
+ const bytes = readFile(fileName(filename));
186
+ const o = rt.construct(rt.classNamed("flash.utils::ByteArray"));
187
+ const b = bytesOf(rt, o);
188
+ b.write(bytes);
189
+ b.position = 0;
190
+ return o;
191
+ }
192
+ static writeByteArray(filename, bytes) {
193
+ const name = fileName(filename);
194
+ const b = bytesOf(rt, bytes);
195
+ writeFile(name, b.buffer.subarray(0, b.length));
196
+ return true;
197
+ }
198
+ }
199
+ // Each Domain is one of the runtime's: a child's definitions after its
200
+ // parent's, its own invisible to the parent and to its siblings. Their
201
+ // domain memory is the runtime's one.
202
+ const domainOf = (o) => o.$domain ?? rt.root;
203
+ class DomainNatives {
204
+ static get currentDomain() {
205
+ return rt.currentDomain();
206
+ }
207
+ static get MIN_DOMAIN_MEMORY_LENGTH() {
208
+ return GLOBAL_MEMORY_MIN_SIZE;
209
+ }
210
+ // As DomainObject::init: a domain after `base`'s. A null base makes
211
+ // avmshell a domain of its own, with builtins of its own, which here
212
+ // are the root's.
213
+ "avmplus:Domain::init"(base) {
214
+ this.$domain = rt.childDomain(base ? domainOf(base) : rt.root);
215
+ }
216
+ // As DomainObject::loadBytes: the ABC compiled by the host, then its
217
+ // entry point run.
218
+ loadBytes(bytes, swfVersion) {
219
+ if (bytes === null || bytes === undefined) {
220
+ throw rt.error("TypeError", 1507, "bytes");
221
+ }
222
+ const version = rt.toUint(swfVersion ?? 0);
223
+ if (version !== 0 && (version < SWF_VERSIONS.first || version > SWF_VERSIONS.last)) {
224
+ throw rt.error("TypeError", 1508, "swfVersion");
225
+ }
226
+ if (!rt.compileAbc) {
227
+ throw rt.unsupported("Domain.loadBytes without RuntimeOptions.compileAbc");
228
+ }
229
+ const domain = domainOf(this);
230
+ const b = bytesOf(rt, bytes);
231
+ const compiled = rt.compileAbc(b.buffer.slice(0, b.length), rt.compileUnit(domain));
232
+ if (typeof compiled === "number") {
233
+ throw rt.error("VerifyError", compiled);
234
+ }
235
+ rt.run(rt.loadInto(domain, () => compiled(rt)));
236
+ return undefined;
237
+ }
238
+ // As DomainObject::getClass: "a.b.C" names C in package a.b.
239
+ getClass(className) {
240
+ if (className === null || className === undefined) {
241
+ throw rt.error("ArgumentError", 1507, "name");
242
+ }
243
+ const name = rt.toString(className);
244
+ const dot = name.lastIndexOf(".");
245
+ const qualified = dot < 0 ? name : `${name.slice(0, dot)}::${name.slice(dot + 1)}`;
246
+ const cls = rt.classNamedByCode(qualified, domainOf(this));
247
+ if (cls === null || typeof cls !== "object" || cls.$it === undefined) {
248
+ throw rt.error("TypeError", 1034, rt.toString(cls), "Class");
249
+ }
250
+ return cls;
251
+ }
252
+ get domainMemory() {
253
+ return rt.memoryProvider;
254
+ }
255
+ set domainMemory(v) {
256
+ setDomainMemory(rt, v);
257
+ }
258
+ }
259
+ // A Worker is one of the workers its VM knows (workersOf), by id; one
260
+ // made and not started keeps its code, as avmplus' m_byteCode.
261
+ class WorkerNatives {
262
+ static pr(s) {
263
+ rt.print(rt.toString(s));
264
+ }
265
+ // As WorkerObjectBase::get_state.
266
+ "flash.system:Worker::internalGetState"() {
267
+ return STATE_NAMES[workersOf(rt).workers.state(this.$id)] || "aborted";
268
+ }
269
+ get isPrimordial() {
270
+ return this.$id === 0;
271
+ }
272
+ isParentOf(other) {
273
+ if (other === null || other === undefined) {
274
+ throw rt.error("TypeError", 2007, "worker");
275
+ }
276
+ return workersOf(rt).workers.parent(other.$id) === this.$id;
277
+ }
278
+ // As avmplus' ChannelItem: undefined deletes; a number is kept as itself,
279
+ // a ByteArray's bytes copied, a shareable one's memory shared, a Mutex
280
+ // or a Condition by reference, and anything else as AMF3, read back as
281
+ // a new copy.
282
+ setSharedProperty(key, value) {
283
+ const { workers } = workersOf(rt);
284
+ const k = sharedKey(rt, key);
285
+ if (value === undefined) {
286
+ workers.set(this.$id, k, null);
287
+ workers.objects.delete(entryKey(this.$id, k));
288
+ return;
289
+ }
290
+ const item = sharedItem(rt, value);
291
+ const token = workers.set(this.$id, k, item);
292
+ if (item.kind === ITEM_BYTES || item.kind === ITEM_SHARED) {
293
+ workers.objects.set(entryKey(this.$id, k), { token, value });
294
+ }
295
+ }
296
+ getSharedProperty(key) {
297
+ const { workers } = workersOf(rt);
298
+ const k = sharedKey(rt, key);
299
+ const entry = workers.get(this.$id, k);
300
+ if (!entry) {
301
+ return undefined;
302
+ }
303
+ switch (entry.kind) {
304
+ case ITEM_NUMBER:
305
+ return new DataView(entry.bytes.buffer).getFloat64(0, true);
306
+ case ITEM_AMF:
307
+ return readAmf(rt, entry.bytes);
308
+ case ITEM_SYNC: {
309
+ // The VM's one object for it, as avmplus interns one for its State.
310
+ const address = new DataView(entry.bytes.buffer).getInt32(1, true);
311
+ return syncObject(rt, { kind: entry.bytes[0] === 0 ? "mutex" : "condition", address });
312
+ }
313
+ }
314
+ // One object a VM for the item, as avmplus interns it.
315
+ const cached = workers.objects.get(entryKey(this.$id, k));
316
+ if (cached?.token === entry.token) {
317
+ return cached.value;
318
+ }
319
+ if (entry.kind === ITEM_SHARED) {
320
+ // The VM's one ByteArray for the memory, by its id.
321
+ const id = new DataView(entry.bytes.buffer).getFloat64(0, true);
322
+ const known = knownSharedByteArray(rt, id);
323
+ if (known) {
324
+ return known;
325
+ }
326
+ const memory = rt.workerHost?.shared?.(id);
327
+ if (!memory) {
328
+ throw rt.unsupported("a shareable ByteArray from a worker whose host does not share it");
329
+ }
330
+ return sharedByteArray(rt, memory);
331
+ }
332
+ const value = newByteArray(rt, entry.bytes);
333
+ workers.objects.set(entryKey(this.$id, k), { token: entry.token, value });
334
+ return value;
335
+ }
336
+ // As WorkerObjectBase::internalStart: its parent starts it, once, on a
337
+ // thread of the host's that runs its code, or the primordial's.
338
+ start() {
339
+ const { workers, threads } = workersOf(rt);
340
+ if (workers.state(this.$id) !== NEW) {
341
+ throw rt.error("flash.errors::IllegalOperationError", 1511);
342
+ }
343
+ if (workers.parent(this.$id) !== workers.self) {
344
+ throw rt.error("flash.errors::IllegalOperationError", 1521);
345
+ }
346
+ if (!rt.workerHost) {
347
+ throw rt.unsupported("starting a Worker without RuntimeOptions.workers");
348
+ }
349
+ const code = this.$code === null || this.$code === undefined ? null : copyOf(rt, this.$code);
350
+ this.$code = null;
351
+ workers.setState(this.$id, CANSTART);
352
+ try {
353
+ threads.set(this.$id, rt.workerHost.start({ id: this.$id, memory: workers.memory, code }));
354
+ }
355
+ catch (e) {
356
+ workers.setState(this.$id, FAILED);
357
+ throw e;
358
+ }
359
+ }
360
+ // As Aggregate::requestIsolateExit: true for a worker started and not
361
+ // yet ended, which is terminated at once, with the workers it started,
362
+ // its thread stopped and their properties let go; false for one not
363
+ // started or ended. The primordial ends with Error 1513; a worker that
364
+ // terminates itself stops at once, as avmshell's does.
365
+ terminate() {
366
+ const { workers, threads } = workersOf(rt);
367
+ // A worker terminating itself stops there, which no script catches.
368
+ if (this.$id !== 0 && this.$id === workers.self) {
369
+ workers.terminateSelf();
370
+ throw new WorkerTerminated();
371
+ }
372
+ if (this.$id === 0) {
373
+ throw rt.error("Error", 1513);
374
+ }
375
+ const ended = workers.terminate(this.$id);
376
+ if (ended.size === 0) {
377
+ return false;
378
+ }
379
+ const thread = threads.get(this.$id);
380
+ threads.delete(this.$id);
381
+ if (thread) {
382
+ stopThread(rt, this.$id, thread, ended);
383
+ }
384
+ return true;
385
+ }
386
+ }
387
+ class WorkerDomainNatives {
388
+ // As Aggregate::listWorkers: those running, the primordial among them.
389
+ listWorkers() {
390
+ const { workers } = workersOf(rt);
391
+ const list = [];
392
+ for (let id = 0; id < workers.count(); id++) {
393
+ if (workers.state(id) === RUNNING) {
394
+ list.push(workerObject(rt, id));
395
+ }
396
+ }
397
+ const cls = rt.applyType(rt.classNamed("__AS3__.vec::Vector"), [
398
+ rt.classNamed("flash.system::Worker"),
399
+ ]);
400
+ const o = cls.$it.instance();
401
+ o.$a = list;
402
+ o.$fixed = false;
403
+ return o;
404
+ }
405
+ // A worker of this one's, NEW; its code is `bytes`, or the primordial's for null.
406
+ "flash.system:WorkerDomain::createWorkerFromByteArrayInternal"(bytes) {
407
+ const o = workerObject(rt, workersOf(rt).workers.create());
408
+ o.$code = bytes;
409
+ return o;
410
+ }
411
+ }
412
+ registerNativeClass(natives, "avmplus::System", SystemNatives);
413
+ registerNativeClass(natives, "avmplus::File", FileNatives);
414
+ registerNativeClass(natives, "avmplus::Domain", DomainNatives);
415
+ registerNativeClass(natives, "flash.system::Worker", WorkerNatives);
416
+ registerNativeClass(natives, "flash.system::WorkerDomain", WorkerDomainNatives);
417
+ return natives;
418
+ }
419
+ /** How long a sleep goes before it looks whether its worker was terminated. */
420
+ const SLEEP_STEP = 50;
421
+ /** How long a terminated worker's thread is given to stop at its next wait or sleep before it is stopped. */
422
+ const STOP_GRACE = 100;
423
+ /**
424
+ * Stop the thread of worker `id`, terminated with the workers in `ended`,
425
+ * whose threads stop with its own. A thread may be stopped anywhere, even
426
+ * where it writes what a Mutex it holds guards, so their Mutexes are let go
427
+ * only once it has stopped: at once where its code stops at its next wait,
428
+ * lock or sleep, as avmplus interrupts it, and which it is given a moment
429
+ * to reach; else once the host says the thread has gone.
430
+ */
431
+ function stopThread(rt, id, thread, ended) {
432
+ const sync = syncOf(rt);
433
+ sync.waitStopped(id, STOP_GRACE);
434
+ void Promise.resolve(thread.terminate()).then(() => {
435
+ for (const d of ended) {
436
+ sync.end(d);
437
+ }
438
+ });
439
+ }
440
+ const vmWorkers = new WeakMap();
441
+ /** The workers as `rt` sees them: those of its primordial, which it is unless a host started it. */
442
+ function workersOf(rt) {
443
+ let vm = vmWorkers.get(rt);
444
+ if (!vm) {
445
+ const init = rt.workerInit;
446
+ vm = {
447
+ workers: init
448
+ ? new Workers(init.memory, init.id)
449
+ : new Workers(newWorkersMemory(syncOf(rt).memory), 0),
450
+ objects: new Map(),
451
+ threads: new Map(),
452
+ };
453
+ vmWorkers.set(rt, vm);
454
+ }
455
+ return vm;
456
+ }
457
+ /** The VM's one Worker for worker `id`, as avmplus interns it; Worker's own constructor refuses. */
458
+ function workerObject(rt, id, cls = rt.classNamed("flash.system::Worker")) {
459
+ const { objects } = workersOf(rt);
460
+ let o = objects.get(id);
461
+ if (!o) {
462
+ o = cls.$it.instance();
463
+ cls.$it.proto.$init.apply(o, []);
464
+ o.$id = id;
465
+ o.$code = null;
466
+ objects.set(id, o);
467
+ }
468
+ return o;
469
+ }
470
+ function newByteArray(rt, bytes) {
471
+ const o = rt.construct(rt.classNamed("flash.utils::ByteArray"));
472
+ const b = bytesOf(rt, o);
473
+ b.write(bytes);
474
+ b.position = 0;
475
+ return o;
476
+ }
477
+ /** A ByteArray's bytes, copied. */
478
+ function copyOf(rt, o) {
479
+ const b = bytesOf(rt, o);
480
+ return b.buffer.slice(0, b.length);
481
+ }
482
+ function readAmf(rt, bytes) {
483
+ return new Reader(rt, bytesOf(rt, newByteArray(rt, bytes))).value();
484
+ }
485
+ /** A shared property's key: null is one of its own, apart from "null". */
486
+ const sharedKey = (rt, key) => key === null || key === undefined ? null : rt.toString(key);
487
+ /** What a shared property keeps of `value`, as makeChannelItem. */
488
+ function sharedItem(rt, value) {
489
+ if (typeof value === "number") {
490
+ const bytes = new Uint8Array(8);
491
+ new DataView(bytes.buffer).setFloat64(0, value, true);
492
+ return { kind: ITEM_NUMBER, bytes };
493
+ }
494
+ if (value !== null && typeof value === "object") {
495
+ if (rt.isInstance(value, rt.classNamed("flash.utils::ByteArray"))) {
496
+ const b = bytesOf(rt, value);
497
+ if (!b.shareable) {
498
+ return { kind: ITEM_BYTES, bytes: copyOf(rt, value) };
499
+ }
500
+ // Its memory, known to every thread before the property names it.
501
+ const memory = b.share();
502
+ rt.workerHost?.share?.(memory);
503
+ const bytes = new Uint8Array(8);
504
+ new DataView(bytes.buffer).setFloat64(0, memory.id, true);
505
+ return { kind: ITEM_SHARED, bytes };
506
+ }
507
+ const ref = syncRef(value);
508
+ if (ref) {
509
+ const bytes = new Uint8Array(5);
510
+ bytes[0] = ref.kind === "mutex" ? 0 : 1;
511
+ new DataView(bytes.buffer).setInt32(1, ref.address, true);
512
+ return { kind: ITEM_SYNC, bytes };
513
+ }
514
+ }
515
+ const holder = newByteArray(rt, new Uint8Array(0));
516
+ const b = bytesOf(rt, holder);
517
+ new Writer(rt, b).value(value);
518
+ return { kind: ITEM_AMF, bytes: b.buffer.slice(0, b.length) };
519
+ }
520
+ /** As construct="abstract" and "native": AS3 does not construct the class itself, a subclass it may. */
521
+ const abstract = (name) => ({
522
+ construct: (rt) => {
523
+ throw rt.error("ArgumentError", 2012, name);
524
+ },
525
+ });
526
+ /**
527
+ * As ShellWorkerClass: Worker.current is the primordial worker, made with
528
+ * the class. And avmshell's classes that test how a native class may limit
529
+ * its construction.
530
+ */
531
+ export const shellHooks = {
532
+ "avmshell::AbstractBase": abstract("AbstractBase"),
533
+ "avmshell::RestrictedBase": { restricted: true },
534
+ "avmshell::AbstractRestrictedBase": { ...abstract("AbstractRestrictedBase"), restricted: true },
535
+ "avmshell::NativeBase": abstract("NativeBase"),
536
+ "avmshell::NativeBaseAS3": abstract("NativeBaseAS3"),
537
+ // As CheckBaseClass::preCreateInstanceCheck, which throws an error of its own.
538
+ "avmshell::CheckBase": {
539
+ construct: (rt) => {
540
+ throw rt.error("ArgumentError", 1001, "avmshell::CheckBase");
541
+ },
542
+ },
543
+ "flash.system::Worker": {
544
+ ...abstract("Worker"),
545
+ created(rt, cls) {
546
+ // Before the class is defined, which classNamed would find.
547
+ setStaticVar(cls, "m_current", workerObject(rt, workersOf(rt).workers.self, cls));
548
+ },
549
+ },
550
+ // As ShellWorkerDomainClass: WorkerDomain.current, made with the class,
551
+ // its constructor empty. A player's WorkerDomain has no m_current to set.
552
+ "flash.system::WorkerDomain": {
553
+ created(_rt, cls) {
554
+ setStaticVar(cls, "m_current", cls.$it.instance());
555
+ },
556
+ },
557
+ };