@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,431 @@
1
+ // A TextField's text and formatting, as Flash keeps them: the characters,
2
+ // each with its own format, and a default format for text that comes with
3
+ // none. Its htmlText is written as Flash writes it, a P for each paragraph
4
+ // with a FONT of the run's five font attributes and a FONT inside it for
5
+ // each later run's changes, and read as Flash reads it, a paragraph's end
6
+ // and a BR a line only in a multiline field.
7
+ /** A new TextField's defaultTextFormat, as adl gives it. */
8
+ export const DEFAULT_FORMAT = {
9
+ font: "Times New Roman",
10
+ size: 12,
11
+ color: 0,
12
+ bold: false,
13
+ italic: false,
14
+ underline: false,
15
+ url: "",
16
+ target: "",
17
+ align: "left",
18
+ leftMargin: 0,
19
+ rightMargin: 0,
20
+ indent: 0,
21
+ leading: 0,
22
+ blockIndent: 0,
23
+ letterSpacing: 0,
24
+ kerning: false,
25
+ bullet: false,
26
+ tabStops: [],
27
+ display: "block",
28
+ };
29
+ const FORMAT_KEYS = Object.keys(DEFAULT_FORMAT);
30
+ /** A TextFormat that sets nothing. */
31
+ export function emptyFormat() {
32
+ const out = {};
33
+ for (const k of FORMAT_KEYS) {
34
+ out[k] = null;
35
+ }
36
+ out.display = "block";
37
+ return out;
38
+ }
39
+ /** `base` with what `change` sets. */
40
+ export function applied(base, change) {
41
+ const out = { ...base };
42
+ for (const k of FORMAT_KEYS) {
43
+ const v = change[k];
44
+ if (v !== null) {
45
+ out[k] = v;
46
+ }
47
+ }
48
+ return out;
49
+ }
50
+ function same(a, b) {
51
+ return (a === b ||
52
+ FORMAT_KEYS.every((k) => k === "tabStops" ? a.tabStops.join() === b.tabStops.join() : a[k] === b[k]));
53
+ }
54
+ /** Text as a field keeps it: Flash's line ends are \r. */
55
+ function normalize(text) {
56
+ return text.replace(/\r\n|\n/g, "\r");
57
+ }
58
+ export class TextModel {
59
+ text = "";
60
+ /** Each character's format; runs share one object. */
61
+ formats = [];
62
+ /** Counts the changes, text, formats or the default, for a layout to know it is current. */
63
+ revision = 0;
64
+ fallback = { ...DEFAULT_FORMAT };
65
+ /** The format of text set as a whole, and of an empty field's line. */
66
+ get defaultFormat() {
67
+ return this.fallback;
68
+ }
69
+ set defaultFormat(format) {
70
+ this.fallback = format;
71
+ this.revision++;
72
+ }
73
+ /** The text, all in the default format, as `text` sets it. */
74
+ setText(text) {
75
+ this.revision++;
76
+ this.text = normalize(text);
77
+ this.formats = new Array(this.text.length).fill(this.defaultFormat);
78
+ }
79
+ /**
80
+ * `text` in place of [begin, end), as replaceText and appendText put it:
81
+ * in the format of the character before, else of the one it replaces,
82
+ * else the default.
83
+ */
84
+ replace(begin, end, text) {
85
+ this.revision++;
86
+ const inserted = normalize(text);
87
+ const format = this.formats[begin - 1] ?? this.formats[begin] ?? this.defaultFormat;
88
+ this.text = this.text.slice(0, begin) + inserted + this.text.slice(end);
89
+ // Not splice with the formats spread: a long text would be more arguments than a call takes.
90
+ this.formats = this.formats
91
+ .slice(0, begin)
92
+ .concat(new Array(inserted.length).fill(format), this.formats.slice(end));
93
+ }
94
+ /** What [begin, end) has in common: each value null where its characters differ; the default's for none. */
95
+ formatOf(begin, end) {
96
+ const out = { ...(this.formats[begin] ?? this.defaultFormat) };
97
+ for (let i = begin + 1; i < end; i++) {
98
+ const f = this.formats[i];
99
+ for (const k of FORMAT_KEYS) {
100
+ const v = out[k];
101
+ if (v !== null &&
102
+ (k === "tabStops" ? v.join() !== f.tabStops.join() : v !== f[k])) {
103
+ out[k] = null;
104
+ }
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /** [begin, end) cut where the format changes: each run's [from, to). */
110
+ runs(begin, end) {
111
+ const out = [];
112
+ for (let i = begin; i < end; i++) {
113
+ const last = out[out.length - 1];
114
+ if (last && same(this.formats[i - 1], this.formats[i])) {
115
+ last[1] = i + 1;
116
+ }
117
+ else {
118
+ out.push([i, i + 1]);
119
+ }
120
+ }
121
+ return out;
122
+ }
123
+ /** [begin, end) given what `change` sets, as setTextFormat does. */
124
+ setFormat(change, begin, end) {
125
+ this.revision++;
126
+ const made = new Map();
127
+ for (let i = begin; i < end; i++) {
128
+ const old = this.formats[i];
129
+ let next = made.get(old);
130
+ if (!next) {
131
+ next = applied(old, change);
132
+ made.set(old, next);
133
+ }
134
+ this.formats[i] = next;
135
+ }
136
+ }
137
+ /** The runs of each paragraph: its text up to a \r, in runs of one format. */
138
+ paragraphs() {
139
+ const out = [];
140
+ let runs = [];
141
+ for (let i = 0; i < this.text.length; i++) {
142
+ const c = this.text[i];
143
+ if (c === "\r") {
144
+ out.push(runs);
145
+ runs = [];
146
+ continue;
147
+ }
148
+ const last = runs[runs.length - 1];
149
+ if (last && same(last.format, this.formats[i])) {
150
+ last.text += c;
151
+ }
152
+ else {
153
+ runs.push({ format: this.formats[i], text: c });
154
+ }
155
+ }
156
+ if (runs.length) {
157
+ out.push(runs);
158
+ }
159
+ return out;
160
+ }
161
+ /** The text as htmlText gives it. */
162
+ toHtml() {
163
+ const out = [];
164
+ for (const runs of this.paragraphs()) {
165
+ const first = runs[0]?.format ?? this.defaultFormat;
166
+ const block = [];
167
+ const extra = [];
168
+ for (const [key, name] of [
169
+ ["leftMargin", "LEFTMARGIN"],
170
+ ["rightMargin", "RIGHTMARGIN"],
171
+ ["indent", "INDENT"],
172
+ ["leading", "LEADING"],
173
+ ["blockIndent", "BLOCKINDENT"],
174
+ ]) {
175
+ if (first[key] !== 0) {
176
+ extra.push(`${name}="${first[key]}"`);
177
+ }
178
+ }
179
+ if (first.tabStops.length) {
180
+ extra.push(`TABSTOPS="${first.tabStops.join(",")}"`);
181
+ }
182
+ // A bullet's paragraph is an LI alone, with no P.
183
+ block.push(first.bullet ? "<LI>" : `<P ALIGN="${first.align.toUpperCase()}">`);
184
+ let open = 0;
185
+ let current = null;
186
+ for (const { format, text } of runs) {
187
+ const attributes = fontAttributes(format, current);
188
+ if (attributes) {
189
+ block.push(`<FONT ${attributes}>`);
190
+ open++;
191
+ }
192
+ current = format;
193
+ let run = escapeHtml(text);
194
+ if (format.underline) {
195
+ run = `<U>${run}</U>`;
196
+ }
197
+ if (format.italic) {
198
+ run = `<I>${run}</I>`;
199
+ }
200
+ if (format.bold) {
201
+ run = `<B>${run}</B>`;
202
+ }
203
+ if (format.url) {
204
+ run = `<A HREF="${escapeHtml(format.url)}" TARGET="${escapeHtml(format.target)}">${run}</A>`;
205
+ }
206
+ block.push(run);
207
+ }
208
+ if (!runs.length) {
209
+ block.push(`<FONT ${fontAttributes(first, null)}>`);
210
+ open++;
211
+ }
212
+ block.push("</FONT>".repeat(open));
213
+ block.push(first.bullet ? "</LI>" : "</P>");
214
+ out.push(extra.length
215
+ ? `<TEXTFORMAT ${extra.join(" ")}>${block.join("")}</TEXTFORMAT>`
216
+ : block.join(""));
217
+ }
218
+ return out.join("");
219
+ }
220
+ /**
221
+ * htmlText set: tags read as Flash reads them, each run in the format
222
+ * its tags give over the default; a paragraph's end and a BR end a line
223
+ * only in a multiline field. With `styles`, a style sheet's, each tag
224
+ * takes its tag's and class's styles.
225
+ */
226
+ setHtml(html, multiline, trimTrailingBreak = false, styles = null) {
227
+ this.revision++;
228
+ let text = "";
229
+ const formats = [];
230
+ const stack = [this.defaultFormat];
231
+ const top = () => stack[stack.length - 1];
232
+ const add = (s, format) => {
233
+ text += s;
234
+ for (let k = 0; k < s.length; k++) {
235
+ formats.push(format);
236
+ }
237
+ };
238
+ const line = () => {
239
+ if (multiline) {
240
+ add("\r", top());
241
+ }
242
+ };
243
+ // Under a sheet, the elements a style displays: a tag of the sheet's
244
+ // own is a block unless inline, ending its line when closed by name, as
245
+ // adl has it (the corpus's `edittext_stylesheet_display`); one displayed
246
+ // as none hides what it holds until then.
247
+ const open = [];
248
+ let hidden = 0;
249
+ const tag = /<(\/?)([a-zA-Z]+)([^>]*)>/g;
250
+ let at = 0;
251
+ for (let m = tag.exec(html); m; m = tag.exec(html)) {
252
+ const plain = html.slice(at, m.index);
253
+ if (plain && hidden === 0) {
254
+ add(normalize(unescapeHtml(plain)), top());
255
+ }
256
+ at = m.index + m[0].length;
257
+ const closing = m[1] === "/";
258
+ const name = m[2].toLowerCase();
259
+ if (name === "br") {
260
+ line();
261
+ continue;
262
+ }
263
+ // Under a style sheet any tag may carry a style.
264
+ const known = ["p", "font", "b", "i", "u", "a", "textformat", "li", "span"];
265
+ if (!known.includes(name) && !styles) {
266
+ continue;
267
+ }
268
+ if (closing && open[open.length - 1]?.name === name) {
269
+ const element = open.pop();
270
+ hidden -= element.hides ? 1 : 0;
271
+ if (element.block && !text.endsWith("\r")) {
272
+ add("\r", top());
273
+ }
274
+ }
275
+ if (closing) {
276
+ // A paragraph's line end is in the paragraph's format, as adl has it.
277
+ if (name === "p" || name === "li") {
278
+ line();
279
+ }
280
+ if (stack.length > 1) {
281
+ stack.pop();
282
+ }
283
+ continue;
284
+ }
285
+ const attributes = attributesOf(m[3]);
286
+ let f = { ...top() };
287
+ if (styles) {
288
+ // The tag's style, a link's, then its class's, each over the last;
289
+ // the display decides the element, not its characters' format.
290
+ const selectors = [name, ...(name === "a" ? ["a:link"] : [])];
291
+ if (attributes.class) {
292
+ selectors.push(`.${attributes.class.toLowerCase()}`);
293
+ }
294
+ let display = "block";
295
+ for (const selector of selectors) {
296
+ const style = styles(selector);
297
+ if (style) {
298
+ f = applied(f, { ...style, display: null });
299
+ display = style.display ?? display;
300
+ }
301
+ }
302
+ const hides = display === "none";
303
+ open.push({ name, block: !known.includes(name) && display !== "inline", hides });
304
+ hidden += hides ? 1 : 0;
305
+ }
306
+ switch (name) {
307
+ case "p":
308
+ if (attributes.align) {
309
+ f.align = attributes.align.toLowerCase();
310
+ }
311
+ break;
312
+ case "font":
313
+ if (attributes.face) {
314
+ f.font = attributes.face;
315
+ }
316
+ if (attributes.size) {
317
+ const size = attributes.size;
318
+ f.size = /^[+-]/.test(size) ? f.size + Number(size) : Number(size);
319
+ }
320
+ if (attributes.color) {
321
+ f.color = Number.parseInt(attributes.color.replace("#", ""), 16) || 0;
322
+ }
323
+ if (attributes.letterspacing) {
324
+ f.letterSpacing = Number(attributes.letterspacing) || 0;
325
+ }
326
+ if (attributes.kerning) {
327
+ f.kerning = attributes.kerning !== "0";
328
+ }
329
+ break;
330
+ case "b":
331
+ f.bold = true;
332
+ break;
333
+ case "i":
334
+ f.italic = true;
335
+ break;
336
+ case "u":
337
+ f.underline = true;
338
+ break;
339
+ case "a":
340
+ f.url = attributes.href ?? "";
341
+ f.target = attributes.target ?? "";
342
+ break;
343
+ case "li":
344
+ f.bullet = true;
345
+ break;
346
+ case "textformat":
347
+ for (const [attribute, key] of [
348
+ ["leftmargin", "leftMargin"],
349
+ ["rightmargin", "rightMargin"],
350
+ ["indent", "indent"],
351
+ ["leading", "leading"],
352
+ ["blockindent", "blockIndent"],
353
+ ]) {
354
+ if (attributes[attribute] !== undefined) {
355
+ f[key] = Number(attributes[attribute]) || 0;
356
+ }
357
+ }
358
+ if (attributes.tabstops) {
359
+ f.tabStops = attributes.tabstops.split(",").map(Number);
360
+ }
361
+ break;
362
+ }
363
+ stack.push(f);
364
+ }
365
+ const rest = html.slice(at);
366
+ if (rest && hidden === 0) {
367
+ add(normalize(unescapeHtml(rest)), top());
368
+ }
369
+ if (trimTrailingBreak && text.endsWith("\r")) {
370
+ text = text.slice(0, -1);
371
+ formats.pop();
372
+ }
373
+ this.text = text;
374
+ this.formats = formats;
375
+ }
376
+ }
377
+ /** A FONT's attributes for `format`: all five for a paragraph's first run, else those that differ from `current`; "" for none. */
378
+ function fontAttributes(format, current) {
379
+ const out = [];
380
+ if (!current || current.font !== format.font) {
381
+ out.push(`FACE="${escapeHtml(format.font)}"`);
382
+ }
383
+ if (!current || current.size !== format.size) {
384
+ out.push(`SIZE="${format.size}"`);
385
+ }
386
+ if (!current || current.color !== format.color) {
387
+ out.push(`COLOR="#${(format.color >>> 0).toString(16).toUpperCase().padStart(6, "0").slice(-6)}"`);
388
+ }
389
+ if (!current || current.letterSpacing !== format.letterSpacing) {
390
+ out.push(`LETTERSPACING="${format.letterSpacing}"`);
391
+ }
392
+ if (!current || current.kerning !== format.kerning) {
393
+ out.push(`KERNING="${format.kerning ? 1 : 0}"`);
394
+ }
395
+ return out.join(" ");
396
+ }
397
+ function escapeHtml(text) {
398
+ return text
399
+ .replace(/&/g, "&amp;")
400
+ .replace(/</g, "&lt;")
401
+ .replace(/>/g, "&gt;")
402
+ .replace(/"/g, "&quot;");
403
+ }
404
+ function unescapeHtml(text) {
405
+ return text.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z]+);/gi, (whole, name) => {
406
+ if (name[0] === "#") {
407
+ const code = name[1] === "x" || name[1] === "X"
408
+ ? Number.parseInt(name.slice(2), 16)
409
+ : Number(name.slice(1));
410
+ return Number.isFinite(code) ? String.fromCodePoint(code) : whole;
411
+ }
412
+ const named = {
413
+ amp: "&",
414
+ lt: "<",
415
+ gt: ">",
416
+ quot: '"',
417
+ apos: "'",
418
+ nbsp: " ",
419
+ };
420
+ return named[name.toLowerCase()] ?? whole;
421
+ });
422
+ }
423
+ /** A tag's attributes by lower-case name, quoted with either quote or not. */
424
+ function attributesOf(source) {
425
+ const out = {};
426
+ const attribute = /([a-zA-Z]+)\s*=\s*("([^"]*)"|'([^']*)'|([^\s>]+))/g;
427
+ for (let m = attribute.exec(source); m; m = attribute.exec(source)) {
428
+ out[m[1].toLowerCase()] = unescapeHtml(m[3] ?? m[4] ?? m[5] ?? "");
429
+ }
430
+ return out;
431
+ }
@@ -0,0 +1,159 @@
1
+ // A background worker's thread (docs/workers.md): a VM of its own, codegen,
2
+ // runtime and playerglobal, playing the SWF createWorker was given with no
3
+ // renderer, sound or input. Its frames run on a timer at the SWF's rate,
4
+ // so that its timers, enterFrame and the events it is sent fire. A host
5
+ // runs this in a Web Worker or a node worker_threads Worker; nothing here
6
+ // knows which.
7
+ import { createCodegen } from "../../codegen/index.js";
8
+ import { avm2 } from "../../runtime/index.js";
9
+ import { Player } from "../player.js";
10
+ import { Scripting } from "../scripting.js";
11
+ /** Run the worker the parent posts, on this thread, until the parent terminates it. */
12
+ export function runWorkerThread(port) {
13
+ let scripting = null;
14
+ // Messages that came while the VM was being made, applied once it is.
15
+ const early = [];
16
+ // How many of the parent's messages have been applied, the start the first.
17
+ let applied = 0;
18
+ let idled = 0;
19
+ let player = null;
20
+ let stopped = false;
21
+ /**
22
+ * Once its worker is terminated, stop it for good, between frames, so
23
+ * that none of its code runs again, then say so in the shared memory: the
24
+ * Mutexes it held are free to take from then on. A lock or wait it asks
25
+ * for after it was terminated is refused, but the frame that asked plays
26
+ * on, its other listeners too, so this waits for the frame's end.
27
+ */
28
+ const stopIfTerminated = () => {
29
+ if (stopped || !scripting || !avm2.syncOf(scripting.rt).terminated) {
30
+ return stopped;
31
+ }
32
+ stopped = true;
33
+ try {
34
+ player?.destroy();
35
+ scripting.destroy();
36
+ }
37
+ catch (error) {
38
+ if (!(error instanceof avm2.SyncTerminated)) {
39
+ port.post({ type: "uncaught", text: describe(error) });
40
+ }
41
+ }
42
+ finally {
43
+ avm2.syncOf(scripting.rt).end(id);
44
+ }
45
+ return true;
46
+ };
47
+ let id = 0;
48
+ const describe = (error) => {
49
+ if (error instanceof Error) {
50
+ return `${error.name}: ${error.message}`;
51
+ }
52
+ try {
53
+ return scripting ? scripting.rt.toString(error) : String(error);
54
+ }
55
+ catch {
56
+ return "an error that could not be described";
57
+ }
58
+ };
59
+ const boot = async ({ codegen, init }) => {
60
+ id = init.id;
61
+ // What the embedder gave the primordial lives on its thread, as
62
+ // functions no message carries: a worker gets none of it, and none of
63
+ // the defaults that would reach past the primordial's (docs/workers.md).
64
+ const storage = new Map();
65
+ const s = new Scripting(await createCodegen(codegen), {
66
+ handedModules: init.modules,
67
+ url: init.url,
68
+ sandboxType: init.sandboxType,
69
+ air: init.air,
70
+ print: (line) => port.post({ type: "trace", line }),
71
+ onUncaught: (error) => port.post({ type: "uncaught", text: describe(error) }),
72
+ workerParent: { id: init.id, post: (message) => port.post(message), shared: init.shared },
73
+ // Its Mutexes, Conditions and channels' queues are among the primordial's.
74
+ sync: { memory: init.sync, thread: init.id },
75
+ audio: null,
76
+ navigate: null,
77
+ fileHost: null,
78
+ clipboard: null,
79
+ webSocket: null,
80
+ sendToUrl: false,
81
+ storage: {
82
+ get: (key) => storage.get(key) ?? null,
83
+ set: (key, bytes) => {
84
+ storage.set(key, bytes.slice());
85
+ },
86
+ remove: (key) => {
87
+ storage.delete(key);
88
+ },
89
+ },
90
+ });
91
+ await s.loadLibraries(init.libraries);
92
+ player = new Player(init.swf, s);
93
+ const playing = player;
94
+ scripting = s;
95
+ applied++;
96
+ for (const message of early.splice(0)) {
97
+ s.workers.fromParent(message);
98
+ applied++;
99
+ }
100
+ // Running, which the worker that made it sees at once.
101
+ avm2.syncOf(s.rt).start(init.id);
102
+ port.post({ type: "running" });
103
+ await playing.start();
104
+ if (stopIfTerminated()) {
105
+ return;
106
+ }
107
+ // Between frames none of its code runs: it stops there at once.
108
+ const watch = setInterval(() => {
109
+ if (stopIfTerminated()) {
110
+ clearInterval(watch);
111
+ }
112
+ }, 10);
113
+ // What was applied before a frame has had its events in it: the parent's settled() waits for that.
114
+ let last = performance.now();
115
+ const frame = () => {
116
+ if (stopIfTerminated()) {
117
+ return;
118
+ }
119
+ const upTo = applied;
120
+ const now = performance.now();
121
+ const played = playing.advance(now - last);
122
+ last = now;
123
+ if (stopIfTerminated()) {
124
+ return;
125
+ }
126
+ if (played > 0 && upTo > idled) {
127
+ idled = upTo;
128
+ port.post({ type: "idle", received: upTo });
129
+ }
130
+ setTimeout(frame, 1000 / playing.frameRate);
131
+ };
132
+ setTimeout(frame, 1000 / playing.frameRate);
133
+ };
134
+ port.listen((message) => {
135
+ if ("codegen" in message) {
136
+ boot(message).catch((error) => {
137
+ // A worker terminated while it started, its constructor waiting or
138
+ // its VM still being made, stops quietly.
139
+ if (stopIfTerminated()) {
140
+ return;
141
+ }
142
+ if (error instanceof avm2.SyncTerminated) {
143
+ stopped = true;
144
+ new avm2.Sync(message.init.sync, message.init.id).end(message.init.id);
145
+ return;
146
+ }
147
+ port.post({ type: "uncaught", text: describe(error) });
148
+ port.post({ type: "terminate" });
149
+ });
150
+ return;
151
+ }
152
+ if (!scripting) {
153
+ early.push(message);
154
+ return;
155
+ }
156
+ scripting.workers.fromParent(message);
157
+ applied++;
158
+ });
159
+ }