js-dos 8.1.5 → 8.1.6

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 (140) hide show
  1. package/dist/emulators/emulators.js +2 -0
  2. package/dist/emulators/emulators.js.map +1 -0
  3. package/dist/emulators/types/build.d.ts +28 -0
  4. package/dist/emulators/types/dos/bundle/dos-bundle.d.ts +20 -0
  5. package/dist/emulators/types/dos/dosbox/ts/direct.d.ts +3 -0
  6. package/dist/emulators/types/dos/dosbox/ts/worker.d.ts +3 -0
  7. package/dist/emulators/types/emulators.d.ts +76 -0
  8. package/dist/emulators/types/http.d.ts +9 -0
  9. package/dist/emulators/types/impl/ci-impl.d.ts +29 -0
  10. package/dist/emulators/types/impl/emulators-impl.d.ts +26 -0
  11. package/dist/emulators/types/impl/modules.d.ts +38 -0
  12. package/dist/emulators/types/libzip/libzip.d.ts +16 -0
  13. package/dist/emulators/types/protocol/messages-queue.d.ts +8 -0
  14. package/dist/emulators/types/protocol/protocol.d.ts +128 -0
  15. package/dist/emulators/wdosbox-x.js +55 -0
  16. package/dist/emulators/wdosbox-x.js.symbols +8760 -0
  17. package/dist/emulators/wdosbox-x.wasm +0 -0
  18. package/dist/emulators/wdosbox.js +55 -0
  19. package/dist/emulators/wdosbox.js.symbols +3001 -0
  20. package/dist/emulators/wdosbox.wasm +0 -0
  21. package/dist/emulators/wlibzip.js +21 -0
  22. package/dist/emulators/wlibzip.js.symbols +268 -0
  23. package/dist/emulators/wlibzip.wasm +0 -0
  24. package/dist/js-dos.css +1 -0
  25. package/dist/js-dos.js +22 -0
  26. package/dist/js-dos.js.map +1 -0
  27. package/package.json +1 -1
  28. package/release.zip +0 -0
  29. package/.eslintrc.json +0 -43
  30. package/.github/workflows/build.yml +0 -51
  31. package/.gitmodules +0 -4
  32. package/index.html +0 -110
  33. package/postcss.config.cjs +0 -8
  34. package/src/app.css +0 -14
  35. package/src/base.css +0 -10
  36. package/src/components/checkbox.tsx +0 -41
  37. package/src/components/close-button.tsx +0 -17
  38. package/src/components/components.css +0 -28
  39. package/src/components/dos-option-checkbox.tsx +0 -94
  40. package/src/components/dos-option-select.tsx +0 -108
  41. package/src/components/dos-option-slider.tsx +0 -35
  42. package/src/components/error.tsx +0 -16
  43. package/src/components/loading.tsx +0 -26
  44. package/src/components/lock.tsx +0 -10
  45. package/src/components/select.tsx +0 -33
  46. package/src/components/slider.tsx +0 -69
  47. package/src/download-file.ts +0 -18
  48. package/src/frame/account-frame.tsx +0 -156
  49. package/src/frame/editor/defaults.ts +0 -419
  50. package/src/frame/editor/editor-conf-frame.tsx +0 -227
  51. package/src/frame/editor/editor-frame.css +0 -55
  52. package/src/frame/editor/editor-fs-frame.tsx +0 -314
  53. package/src/frame/fat-drives-frame.tsx +0 -199
  54. package/src/frame/frame.css +0 -119
  55. package/src/frame/frame.tsx +0 -34
  56. package/src/frame/image-rendering-frame.tsx +0 -8
  57. package/src/frame/network-frame.tsx +0 -157
  58. package/src/frame/quick-save-frame.tsx +0 -98
  59. package/src/frame/settings-frame.tsx +0 -14
  60. package/src/frame/stats-frame.tsx +0 -87
  61. package/src/host/bundle-storage.ts +0 -91
  62. package/src/host/fullscreen.ts +0 -35
  63. package/src/host/lcache.ts +0 -203
  64. package/src/host/lstorage.ts +0 -156
  65. package/src/i18n.ts +0 -185
  66. package/src/index.css +0 -7
  67. package/src/load.ts +0 -132
  68. package/src/login/login.css +0 -9
  69. package/src/login/login.tsx +0 -77
  70. package/src/main.tsx +0 -197
  71. package/src/public/types.ts +0 -45
  72. package/src/sidebar/account-button.tsx +0 -33
  73. package/src/sidebar/cloud-save-button.tsx +0 -89
  74. package/src/sidebar/diskette-icon.tsx +0 -14
  75. package/src/sidebar/fullscreen-button.tsx +0 -44
  76. package/src/sidebar/network-button.tsx +0 -39
  77. package/src/sidebar/sidebar-button.tsx +0 -244
  78. package/src/sidebar/sidebar.css +0 -47
  79. package/src/sidebar/sidebar.tsx +0 -30
  80. package/src/sockdrive/LICENSE +0 -674
  81. package/src/sockdrive/README.md +0 -45
  82. package/src/sockdrive/include/sockdrive.h +0 -23
  83. package/src/sockdrive/js/.eslintrc.json +0 -43
  84. package/src/sockdrive/js/package.json +0 -29
  85. package/src/sockdrive/js/src/fatfs/chains.js +0 -318
  86. package/src/sockdrive/js/src/fatfs/dir.js +0 -385
  87. package/src/sockdrive/js/src/fatfs/helpers.js +0 -210
  88. package/src/sockdrive/js/src/fatfs/index.js +0 -606
  89. package/src/sockdrive/js/src/fatfs/structs.js +0 -255
  90. package/src/sockdrive/js/src/fatfs/vol.js +0 -166
  91. package/src/sockdrive/js/src/sockdrive/cache.ts +0 -56
  92. package/src/sockdrive/js/src/sockdrive/drive.ts +0 -471
  93. package/src/sockdrive/js/src/sockdrive/lru.ts +0 -221
  94. package/src/sockdrive/js/src/sockdrive/types.ts +0 -14
  95. package/src/sockdrive/js/src/sockdrive-fat.d.ts +0 -64
  96. package/src/sockdrive/js/src/sockdrive-fat.ts +0 -226
  97. package/src/sockdrive/js/src/sockdrive-native.ts +0 -100
  98. package/src/sockdrive/js/src/test/test.ts +0 -289
  99. package/src/sockdrive/js/tsconfig.json +0 -11
  100. package/src/sockdrive/js/webpack.config.js +0 -68
  101. package/src/sockdrive/js/yarn.lock +0 -1808
  102. package/src/store/auth.ts +0 -115
  103. package/src/store/dos.ts +0 -305
  104. package/src/store/editor.ts +0 -61
  105. package/src/store/init.ts +0 -48
  106. package/src/store/storage.ts +0 -32
  107. package/src/store/ui.ts +0 -191
  108. package/src/store.tsx +0 -116
  109. package/src/ui.tsx +0 -140
  110. package/src/v8/changes.ts +0 -56
  111. package/src/v8/config.ts +0 -20
  112. package/src/v8/subscriptions.ts +0 -62
  113. package/src/vite-env.d.ts +0 -5
  114. package/src/window/dos/controls/keyboard.ts +0 -32
  115. package/src/window/dos/controls/keys.ts +0 -331
  116. package/src/window/dos/controls/mouse/mount.ts +0 -99
  117. package/src/window/dos/controls/mouse/mouse-locked.ts +0 -51
  118. package/src/window/dos/controls/mouse/mouse-not-locked.ts +0 -84
  119. package/src/window/dos/controls/mouse/mouse-swipe.ts +0 -57
  120. package/src/window/dos/controls/mouse/pointer.ts +0 -85
  121. package/src/window/dos/controls/mouse.ts +0 -21
  122. package/src/window/dos/dos-dhry2.tsx +0 -191
  123. package/src/window/dos/dos-runtime.tsx +0 -216
  124. package/src/window/dos/dos-window.tsx +0 -91
  125. package/src/window/dos/render/canvas.ts +0 -65
  126. package/src/window/dos/render/resize.ts +0 -31
  127. package/src/window/dos/render/webgl.ts +0 -173
  128. package/src/window/dos/sound/audio-node.ts +0 -148
  129. package/src/window/error-window.tsx +0 -9
  130. package/src/window/loading-window.tsx +0 -54
  131. package/src/window/prerun-window.tsx +0 -121
  132. package/src/window/select-window.tsx +0 -118
  133. package/src/window/window.css +0 -78
  134. package/src/window/window.tsx +0 -49
  135. package/src/ws/ws-sockdrive.ts +0 -123
  136. package/src/ws/ws-transport-layer.ts +0 -468
  137. package/tailwind.config.cjs +0 -48
  138. package/tsconfig.json +0 -32
  139. package/tsconfig.node.json +0 -9
  140. package/vite.config.ts +0 -25
@@ -0,0 +1,2 @@
1
+ !function e(s,t,i){function o(r,a){if(!t[r]){if(!s[r]){var l="function"==typeof require&&require;if(!a&&l)return l(r,!0);if(n)return n(r,!0);var d=new Error("Cannot find module '"+r+"'");throw d.code="MODULE_NOT_FOUND",d}var u=t[r]={exports:{}};s[r][0].call(u.exports,(function(e){return o(s[r][1][e]||e)}),u,u.exports,e,s,t,i)}return t[r].exports}for(var n="function"==typeof require&&require,r=0;r<i.length;r++)o(i[r]);return o}({1:[function(e,s,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Build=void 0,t.Build={version:"8.1.3 (efad5b97a9ef969bca0bab3dfe583ea1)",buildSeed:1718003991837,"wdosbox-x.wasm":{size:6528995,gzSize:2295538},"wdosbox-x.js":{size:252241,gzSize:59282},"wdosbox.wasm":{size:1465312,gzSize:498769},"wdosbox.js":{size:128411,gzSize:33707},"wlibzip.wasm":{size:111405,gzSize:51546},"wlibzip.js":{size:75391,gzSize:19757}}},{}],2:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}var o=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.defaultConfig=void 0;const n=o(e("../../libzip/libzip")),r=e("../../http"),a=e("../../build");t.default=class{constructor(e){i(this,"dosboxConf",t.defaultConfig),i(this,"jsdosConf",{version:a.Build.version}),i(this,"sources",void 0),i(this,"libzipWasm",void 0),this.sources=[],this.libzipWasm=e}autoexec(){const e=this.dosboxConf.indexOf("[autoexec]");for(var s=arguments.length,t=new Array(s),i=0;i<s;i++)t[i]=arguments[i];return this.dosboxConf=this.dosboxConf.substring(0,e)+"[autoexec]\nmount c .\nc:\n"+t.join("\n"),this}extract(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/",t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"zip";return this.extractAll([{url:e,path:s,type:t}])}extractAll(e){return this.sources.push(...e),this}async toUint8Array(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const s={};await this.libzipWasm.instantiate(s);const t=new n.default(s),i=[];for(const e of this.sources){if("zip"!==e.type)throw new Error("Only Zip is supported");const s=(0,r.httpRequest)(e.url,{responseType:"arraybuffer"}).then((s=>({source:e,data:new Uint8Array(s)})));i.push(s)}e||(await t.writeFile(".jsdos/dosbox.conf",this.dosboxConf),await t.writeFile(".jsdos/readme.txt",l),await t.writeFile(".jsdos/jsdos.json",JSON.stringify(this.jsdosConf,null,2)));const o=await Promise.all(i);for(const e of o)t.zipToFs(e.data,e.source.path);e&&(await t.writeFile(".jsdos/dosbox.conf",this.dosboxConf),await t.writeFile(".jsdos/readme.txt",l),await t.writeFile(".jsdos/jsdos.json",JSON.stringify(this.jsdosConf,null,2)));const a=await t.zipFromFs();return t.destroy(),a}};const l="\nPlease visit our website:\n\n _ __\n (_)____ ____/ /___ _____ _________ ____ ___\n / / ___/_____/ __ / __ \\/ ___// ___/ __ \\/ __ `__ \\\n / (__ )_____/ /_/ / /_/ (__ )/ /__/ /_/ / / / / / /\n __/ /____/ \\__,_/\\____/____(_)___/\\____/_/ /_/ /_/\n /___/\n".replace(/\n/g,"\r\n");t.defaultConfig="[sdl]\nautolock=false\n\nfullscreen=false\nfulldouble=false\nfullresolution=original\nwindowresolution=original\noutput=surface\nsensitivity=100\nwaitonerror=true\npriority=higher,normal\nmapperfile=mapper-jsdos.map\nusescancodes=true\nvsync=false\n[dosbox]\nmachine=svga_s3\n\nlanguage=\ncaptures=capture\nmemsize=16\n[cpu]\ncore=auto\ncputype=auto\ncycles=auto\n\ncycleup=10\ncycledown=20\n[mixer]\nnosound=false\nrate=44100\n\nblocksize=1024\nprebuffer=20\n\n[render]\n# frameskip: How many frames DOSBox skips before drawing one.\n# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.\n# scaler: Scaler used to enlarge/enhance low resolution modes.\n# If 'forced' is appended, then the scaler will be used even if the result might not be desired.\n# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.\n\nframeskip=0\naspect=false\nscaler=none\n\n[midi]\n# mpu401: Type of MPU-401 to emulate.\n# Possible values: intelligent, uart, none.\n# mididevice: Device that will receive the MIDI data from MPU-401.\n# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.\n# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use.\n# See the README/Manual for more details.\n\nmpu401=intelligent\nmididevice=default\nmidiconfig=\n\n[sblaster]\n# sbtype: Type of Soundblaster to emulate. gb is Gameblaster.\n# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.\n# sbbase: The IO address of the soundblaster.\n# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.\n# irq: The IRQ number of the soundblaster.\n# Possible values: 7, 5, 3, 9, 10, 11, 12.\n# dma: The DMA number of the soundblaster.\n# Possible values: 1, 5, 0, 3, 6, 7.\n# hdma: The High DMA number of the soundblaster.\n# Possible values: 1, 5, 0, 3, 6, 7.\n# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.\n# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.\n# Possible values: auto, cms, opl2, dualopl2, opl3, none.\n# oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well).\n# Possible values: default, compat, fast.\n# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).\n# Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.\n\nsbtype=sb16\nsbbase=220\nirq=7\ndma=1\nhdma=5\nsbmixer=true\noplmode=auto\noplemu=default\noplrate=44100\n\n[gus]\n# gus: Enable the Gravis Ultrasound emulation.\n# gusrate: Sample rate of Ultrasound emulation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# gusbase: The IO base address of the Gravis Ultrasound.\n# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.\n# gusirq: The IRQ number of the Gravis Ultrasound.\n# Possible values: 5, 3, 7, 9, 10, 11, 12.\n# gusdma: The DMA channel of the Gravis Ultrasound.\n# Possible values: 3, 0, 1, 5, 6, 7.\n# ultradir: Path to Ultrasound directory. In this directory\n# there should be a MIDI directory that contains\n# the patch files for GUS playback. Patch sets used\n# with Timidity should work fine.\n\ngus=false\ngusrate=44100\ngusbase=240\ngusirq=5\ngusdma=3\nultradir=C:\\ULTRASND\n\n[speaker]\n# pcspeaker: Enable PC-Speaker emulation.\n# pcrate: Sample rate of the PC-Speaker sound generation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.\n# Possible values: auto, on, off.\n# tandyrate: Sample rate of the Tandy 3-Voice generation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).\n\npcspeaker=true\npcrate=44100\ntandy=auto\ntandyrate=44100\ndisney=true\n\n[joystick]\n# joysticktype: Type of joystick to emulate: auto (default), none,\n# 2axis (supports two joysticks),\n# 4axis (supports one joystick, first joystick used),\n# 4axis_2 (supports one joystick, second joystick used),\n# fcs (Thrustmaster), ch (CH Flightstick).\n# none disables joystick emulation.\n# auto chooses emulation depending on real joystick(s).\n# (Remember to reset dosbox's mapperfile if you saved it earlier)\n# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.\n# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away).\n# autofire: continuously fires as long as you keep the button pressed.\n# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.\n# buttonwrap: enable button wrapping at the number of emulated buttons.\n\njoysticktype=auto\ntimed=true\nautofire=false\nswap34=false\nbuttonwrap=false\n\n[serial]\n# serial1: set type of device connected to com port.\n# Can be disabled, dummy, modem, nullmodem, directserial.\n# Additional parameters must be in the same line in the form of\n# parameter:value. Parameter for all types is irq (optional).\n# for directserial: realport (required), rxdelay (optional).\n# (realport:COM1 realport:ttyS0).\n# for modem: listenport (optional).\n# for nullmodem: server, rxdelay, txdelay, telnet, usedtr,\n# transparent, port, inhsocket (all optional).\n# Example: serial1=modem listenport:5000\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial2: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial3: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial4: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n\nserial1=dummy\nserial2=dummy\nserial3=disabled\nserial4=disabled\n\n[dos]\n# xms: Enable XMS support.\n# ems: Enable EMS support.\n# umb: Enable UMB support.\n# keyboardlayout: Language code of the keyboard layout (or none).\n\nxms=true\nems=true\numb=true\nkeyboardlayout=auto\n\n[ipx]\n# ipx: Enable ipx over UDP/IP emulation.\n\nipx=true\n[autoexec]\necho off\nmount c .\nc:\n\ntype jsdos~1/readme.txt\necho on\n\n# Generated using https://js-dos.com\n# █▀▀▀▀▀█ █ ▄▄▄▀▀█ █▀▀▀▀▀█\n# █ ███ █ ██▄ █ ▀ ▄ █ ███ █\n# █ ▀▀▀ █ ▄██ ▀ ▀▀█ █ ▀▀▀ █\n# ▀▀▀▀▀▀▀ ▀ █▄▀▄▀ █ ▀▀▀▀▀▀▀\n# █▀▄▄█▀▀▄▄ ▀ ▀█▄▄▄▄ ▀▄█▀█▀\n# █▀ ▀ ▀▀▄ █▀ ▄ ▄▀▀▀▄ █▀█▄\n# ▄ ▄▄ █▀▀▄ ▄▀▄▀▀█ ▀▀▄▀▀█▀\n# ▄▀▀█▀▀ █▀█▀█▀▀▄ ▀██▀█▄\n# ▀▀▀ ▀ ▀ █▄█ ▀█▄▄█▀▀▀█▀▀\n# █▀▀▀▀▀█ ▄▄▄ ▄ ▄ █ ▀ █▄▄▄▄\n# █ ███ █ ▀█▀▀▄▀▀▄████▀▀█▄█\n# █ ▀▀▀ █ ▄▀▀█▀█▀▄ ▀▀▄▄█▄█\n# ▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀\n".replace(/\n/g,"\r\n")},{"../../build":1,"../../http":6,"../../libzip/libzip":10}],3:[function(e,s,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dosDirect=void 0;const i=e("../../../protocol/messages-queue");t.dosDirect=async function(e,s){const t=new i.MessagesQueue;let o=t.handler.bind(t);const n={postMessage:(e,s)=>{o(e,s)}},r=e=>{const t=e.data;"ws-sync-sleep"===t?.name&&t.props.sessionId===s&&postMessage({name:"wc-sync-sleep",props:t.props},"*")},a={sessionId:s,sendMessageToServer:(e,s)=>{n.messageHandler({data:{name:e,props:s}})},initMessageHandler:e=>{o=e,t.sendTo(o)},exit:()=>{"undefined"!=typeof window&&window.removeEventListener("message",r)}};return a.module=n,"undefined"!=typeof window&&window.addEventListener("message",r,{passive:!0}),await e.instantiate(n),n.callMain([s]),a}},{"../../../protocol/messages-queue":11}],4:[function(e,s,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.dosWorker=void 0;const i=e("../../../protocol/messages-queue");t.dosWorker=async function(e,s,t){const o=new i.MessagesQueue;let n=o.handler.bind(o);const r=await fetch(e);if(200!==r.status)throw new Error("Unable to download '"+e+"' ("+r.status+"): "+r.statusText);const a=URL.createObjectURL(await r.blob()),l=new Worker(a);l.onerror=e=>{n("ws-err",{type:e.type,filename:e.filename,message:e.message})},l.onmessage=e=>{const s=e.data;void 0!==s?.name&&n(s.name,s.props)},await s.instantiate({});const d={sessionId:t,sendMessageToServer:(e,s,t)=>{t?l.postMessage({name:e,props:s},t):l.postMessage({name:e,props:s})},initMessageHandler:e=>{n=e,o.sendTo(n)},exit:()=>{URL.revokeObjectURL(a),l.terminate()}};try{d.sendMessageToServer("wc-install",{module:s.wasmModule,sessionId:t})}catch(e){d.sendMessageToServer("wc-install",{sessionId:t})}return d}},{"../../../protocol/messages-queue":11}],5:[function(e,s,t){(function(s){(function(){"use strict";var i=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.NetworkType=void 0;const o=i(e("./impl/emulators-impl"));!function(e){e[e.NETWORK_DOSBOX_IPX=0]="NETWORK_DOSBOX_IPX"}(t.NetworkType||(t.NetworkType={})),"undefined"!=typeof window&&(window.emulators=o.default),void 0!==s&&(s.emulators=o.default)}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./impl/emulators-impl":8}],6:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0}),t.httpRequest=void 0,t.httpRequest=function(e,s){return new Promise(((t,i)=>{new o(e,{...s,success:t,fail:e=>{i(new Error(e))}})}))};class o{constructor(e,s){if(i(this,"resource",void 0),i(this,"options",void 0),i(this,"xhr",null),i(this,"total",0),i(this,"loaded",0),this.resource=e,this.options=s,this.options.method=s.method||"GET","GET"!==this.options.method)throw new Error("Method "+this.options.method+" is not supported");this.makeHttpRequest()}makeHttpRequest(){let e,s;this.xhr=new XMLHttpRequest,this.xhr.open(this.options.method||"GET",this.resource,!0),"POST"===this.options.method&&this.xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"),this.xhr.overrideMimeType("text/plain; charset=x-user-defined"),"function"==typeof(e=this.xhr).addEventListener&&e.addEventListener("progress",(e=>{if(this.total=e.total,this.loaded=e.loaded,this.options.progress)return this.options.progress(e.total,e.loaded)})),"function"==typeof(s=this.xhr).addEventListener&&s.addEventListener("error",(()=>{if(this.options.fail)return this.options.fail("Unalbe to download '"+this.resource+"', code: "+this.xhr.status),delete this.options.fail})),this.xhr.onreadystatechange=()=>this.onReadyStateChange(),this.options.responseType&&(this.xhr.responseType=this.options.responseType),this.xhr.send(this.options.data)}onReadyStateChange(){const e=this.xhr;if(4===e.readyState)if(200===e.status){if(this.options.success){const s=Math.max(this.total,this.loaded);return void 0!==this.options.progress&&this.options.progress(s,s),this.options.success(e.response)}}else if(this.options.fail)return this.options.fail("Unable to download '"+this.resource+"', code: "+e.status),delete this.options.fail}}},{}],7:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0}),t.CommandInterfaceEventsImpl=void 0;t.CommandInterfaceEventsImpl=class{constructor(){var e=this;i(this,"onStdoutConsumers",[]),i(this,"delayedStdout",[]),i(this,"onFrameSizeConsumers",[]),i(this,"onFrameConsumers",[]),i(this,"onSoundPushConsumers",[]),i(this,"onExitConsumers",[]),i(this,"onMessageConsumers",[]),i(this,"delayedMessages",[]),i(this,"onNetworkConnectedConsumers",[]),i(this,"onNetworkDisconnectedConsumers",[]),i(this,"onStdout",(e=>{if(this.onStdoutConsumers.push(e),1===this.onStdoutConsumers.length){for(const e of this.delayedStdout)this.fireStdout(e);this.delayedStdout=[]}})),i(this,"onFrameSize",(e=>{this.onFrameSizeConsumers.push(e)})),i(this,"onFrame",(e=>{this.onFrameConsumers.push(e)})),i(this,"onSoundPush",(e=>{this.onSoundPushConsumers.push(e)})),i(this,"onExit",(e=>{this.onExitConsumers.push(e)})),i(this,"onMessage",(e=>{if(this.onMessageConsumers.push(e),1===this.onMessageConsumers.length){for(const s of this.delayedMessages)e(s.msgType,...s.args);this.delayedMessages=[]}})),i(this,"fireStdout",(e=>{if(0!==this.onStdoutConsumers.length)for(const s of this.onStdoutConsumers)s(e);else this.delayedStdout.push(e)})),i(this,"fireFrameSize",((e,s)=>{for(const t of this.onFrameSizeConsumers)t(e,s)})),i(this,"fireFrame",((e,s)=>{for(const t of this.onFrameConsumers)t(e,s)})),i(this,"fireSoundPush",(e=>{for(const s of this.onSoundPushConsumers)s(e)})),i(this,"fireExit",(()=>{for(const e of this.onExitConsumers)e();this.onStdoutConsumers=[],this.onFrameSizeConsumers=[],this.onFrameConsumers=[],this.onSoundPushConsumers=[],this.onExitConsumers=[],this.onMessageConsumers=[]})),i(this,"fireMessage",(function(s){for(var t=arguments.length,i=new Array(t>1?t-1:0),o=1;o<t;o++)i[o-1]=arguments[o];if(0!==e.onMessageConsumers.length)for(const t of e.onMessageConsumers)t(s,...i);else e.delayedMessages.push({msgType:s,args:i})})),i(this,"fireNetworkConnected",((e,s)=>{for(const t of this.onNetworkConnectedConsumers)t(e,s)})),i(this,"fireNetworkDisconnected",(e=>{for(const s of this.onNetworkDisconnectedConsumers)s(e)}))}onNetworkConnected(e){this.onNetworkConnectedConsumers.push(e)}onNetworkDisconnected(e){this.onNetworkDisconnectedConsumers.push(e)}}},{}],8:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}var o=function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const n=e("../build"),r=e("./modules"),a=o(e("../dos/bundle/dos-bundle")),l=e("../dos/dosbox/ts/direct"),d=e("../dos/dosbox/ts/worker"),u=e("../protocol/protocol"),h=o(e("../libzip/libzip"));const c=new class{constructor(){i(this,"pathPrefix",""),i(this,"version",n.Build.version),i(this,"wdosboxJs","wdosbox.js"),i(this,"wdosboxxJs","wdosbox-x.js"),i(this,"wasmModulesPromise",void 0)}async bundle(){const e=await this.wasmModules(),s=await e.libzip();return new a.default(s)}async bundleConfig(e){const s=await this.wasmModules(),t=await s.libzip(),i={};await t.instantiate(i);const o=new h.default(i);try{o.zipToFs(e,"/",".jsdos/");try{const e=await o.readFile(".jsdos/dosbox.conf");try{const s=await o.readFile(".jsdos/jsdos.json");return{dosboxConf:e,jsdosConf:JSON.parse(s)}}catch(e){}return{dosboxConf:e,jsdosConf:{version:n.Build.version}}}catch(e){}return null}finally{o.destroy()}}async bundleUpdateConfig(e,s){const t=await this.wasmModules(),i=await t.libzip(),o={};await i.instantiate(o);const n=new h.default(o);try{return await n.writeFile("bundle.zip",e),await n.writeFile(".jsdos/dosbox.conf",s.dosboxConf),await n.writeFile(".jsdos/jsdos.json",JSON.stringify(s.jsdosConf)),await n.zipAddFile("bundle.zip",".jsdos/jsdos.json"),await n.zipAddFile("bundle.zip",".jsdos/dosbox.conf"),await n.readFile("bundle.zip","binary")}finally{n.destroy()}}async dosboxNode(e,s){return this.dosboxDirect(e,s)}async dosboxDirect(e,s){const t=await this.wasmModules(),i=await t.dosbox(),o=await(0,l.dosDirect)(i,"session-"+Date.now());return this.backend(e,o,s)}async dosboxWorker(e,s){const t=await this.wasmModules(),i=await t.dosbox(),o=await(0,d.dosWorker)(this.pathPrefix+this.wdosboxJs,i,"session-"+Date.now());return this.backend(e,o,s)}async dosboxXNode(e,s){return this.dosboxXDirect(e,s)}async dosboxXDirect(e,s){const t=await this.wasmModules(),i=await t.dosboxx(),o=await(0,l.dosDirect)(i,"session-"+Date.now());return this.backend(e,o,s)}async dosboxXWorker(e,s){const t=await this.wasmModules(),i=await t.dosboxx(),o=await(0,d.dosWorker)(this.pathPrefix+this.wdosboxxJs,i,"session-"+Date.now());return this.backend(e,o,s)}async backend(e,s,t){return new Promise(((i,o)=>{const n=new u.CommandInterfaceOverTransportLayer(Array.isArray(e)?e:[e],s,(e=>{null!==e?o(e):setTimeout((()=>i(n)),4)}),t||{})}))}wasmModules(){if(void 0!==this.wasmModulesPromise)return this.wasmModulesPromise;return this.wasmModulesPromise=(async()=>new r.WasmModulesImpl(this.pathPrefix,this.wdosboxJs,this.wdosboxxJs))(),this.wasmModulesPromise}async dosDirect(e){return this.dosboxDirect(e)}async dosWorker(e){return this.dosboxWorker(e)}};t.default=c},{"../build":1,"../dos/bundle/dos-bundle":2,"../dos/dosbox/ts/direct":3,"../dos/dosbox/ts/worker":4,"../libzip/libzip":10,"../protocol/protocol":12,"./modules":9}],9:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0}),t.loadWasmModule=t.WasmModulesImpl=t.host=void 0;const o=e("../http");t.host=new class{constructor(){if(i(this,"wasmSupported",!1),i(this,"globals",void 0),this.globals="undefined"==typeof window?{}:window,this.globals.exports||(this.globals.exports={}),this.globals.compiled||(this.globals.compiled={}),"object"==typeof WebAssembly&&"function"==typeof WebAssembly.instantiate&&"function"==typeof WebAssembly.compile){const e=new WebAssembly.Module(Uint8Array.of(0,97,115,109,1,0,0,0));e instanceof WebAssembly.Module&&(this.wasmSupported=new WebAssembly.Instance(e)instanceof WebAssembly.Instance)}Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(e,s){const t=65535&e,i=65535&s;return t*i+((e>>>16)*i+t*(s>>>16)<<16)|0}),Math.imul=Math.imul,Math.fround||(Math.fround=function(e){return e}),Math.fround=Math.fround,Math.clz32||(Math.clz32=function(e){e>>>=0;for(let s=0;s<32;s++)if(e&1<<31-s)return s;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(e){return e<0?Math.ceil(e):Math.floor(e)}),Math.trunc=Math.trunc}};function n(s,i,n){return"undefined"==typeof XMLHttpRequest?function(s,i,o){if(void 0!==t.host.globals.compiled[i])return t.host.globals.compiled[i];const n=e(s),a=Promise.resolve(new r(n));i&&(t.host.globals.compiled[i]=a);return a}(s,i):function(e,s,i){if(void 0!==t.host.globals.compiled[s])return t.host.globals.compiled[s];async function n(){const n=e.lastIndexOf("/"),r=e.indexOf("w",n),l=r===n+1&&r>=0;if(!t.host.wasmSupported||!l)throw new Error("Starting from js-dos 6.22.60 js environment is not supported");const d=e.substr(0,e.lastIndexOf(".js"))+".wasm",u=(0,o.httpRequest)(d,{responseType:"arraybuffer",progress:(s,t)=>{i("Resolving DosBox ("+e+")",s,t)}}),h=(0,o.httpRequest)(e,{progress:(e,s)=>{i("Resolving DosBox",e,s)}}),[c,m]=await Promise.all([u,h]),f=await WebAssembly.compile(c),p=(e,s)=>{e.env=e.env||{},WebAssembly.instantiate(f,e).then((e=>s(e,f)))};return eval.call(window,m),new a(f,t.host.globals.exports[s],p)}const r=n();s&&(t.host.globals.compiled[s]=r);return r}(s,i,n)}t.WasmModulesImpl=class{constructor(e,s,t){i(this,"pathPrefix",void 0),i(this,"wdosboxJs",void 0),i(this,"wdosboxxJs",void 0),i(this,"libzipPromise",void 0),i(this,"dosboxPromise",void 0),i(this,"dosboxxPromise",void 0),i(this,"wasmSupported",!1),e.length>0&&"/"!==e[e.length-1]&&(e+="/"),this.pathPrefix=e,this.wdosboxJs=s,this.wdosboxxJs=t}libzip(){return void 0!==this.libzipPromise||(this.libzipPromise=this.loadModule(this.pathPrefix+"wlibzip.js","WLIBZIP")),this.libzipPromise}dosbox(){return void 0!==this.dosboxPromise||(this.dosboxPromise=this.loadModule(this.pathPrefix+this.wdosboxJs,"WDOSBOX")),this.dosboxPromise}dosboxx(){return void 0!==this.dosboxxPromise||(this.dosboxxPromise=this.loadModule(this.pathPrefix+this.wdosboxxJs,"WDOSBOXX")),this.dosboxxPromise}loadModule(e,s){return n(e,s,(()=>{}))}},t.loadWasmModule=n;class r{constructor(e){i(this,"emModule",void 0),this.emModule=e}instantiate(e){return new Promise((s=>{e.onRuntimeInitialized=()=>{s()},new this.emModule(e)}))}}class a{constructor(e,s,t){i(this,"wasmModule",void 0),i(this,"module",void 0),i(this,"instantiateWasm",void 0),this.wasmModule=e,this.module=s,this.instantiateWasm=t}instantiate(e){return new Promise((s=>{e.instantiateWasm=this.instantiateWasm,e.onRuntimeInitialized=()=>{s()},new this.module(e)}))}}},{"../http":6}],10:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0});t.default=class{constructor(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/home/web_user";i(this,"module",void 0),i(this,"home",void 0),this.module=e,this.home=s,this.module.callMain([]),this.module.FS.ignorePermissions=!0,this.chdirToHome()}zipFromFs(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;this.chdirToHome();const s=this.module._zip_from_fs(e);if(0===s)return Promise.reject(new Error("Can't create zip, see more info in logs"));const t=this.module.HEAPU32[s/4],i=this.module.HEAPU8.slice(s+4,s+4+t);return this.module._free(s),Promise.resolve(i)}zipToFs(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"/",t=arguments.length>2?arguments[2]:void 0;const i=this.module;s=this.normalizeFilename(s);const o=this.normalizeFilename(s).split("/");this.createPath(o,0,o.length),this.chdir(s);const n=void 0!==t&&t.length>0;let r=0;if(n){const e=i.lengthBytesUTF8(t)+1;r=i._malloc(e),i.stringToUTF8(t,r,e)}const a=new Uint8Array(e),l=i._malloc(a.length);i.HEAPU8.set(a,l);const d=i._zip_to_fs(l,a.length,r);return i._free(l),this.chdirToHome(),n&&i._free(r),0===d?Promise.resolve():Promise.reject(new Error("Can't extract zip, retcode "+d+", see more info in logs"))}writeFile(e,s){e=this.normalizeFilename(e),s instanceof ArrayBuffer&&(s=new Uint8Array(s));const t=e.split("/");if(0===t.length)throw new Error("Can't create file '"+e+"', because it's not valid file path");const i=t[t.length-1].trim();if(0===i.length)throw new Error("Can't create file '"+e+"', because file name is empty");const o=this.createPath(t,0,t.length-1);this.module.FS.writeFile(o+"/"+i,s)}async readFile(e){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"utf8";return e=this.normalizeFilename(e),this.module.FS.readFile(e,{encoding:s})}exists(e){e=this.normalizeFilename(e);try{return this.module.FS.lookupPath(e),!0}catch(e){return!1}}destroy(){try{this.module._libzip_destroy()}catch(e){return e}}normalizeFilename(e){for(e=e.replace(new RegExp("^[a-zA-z]+:"),"").replace(new RegExp("\\\\","g"),"/");"/"===e[0];)e=e.substr(1);return e}createPath(e,s,t){let i=".";for(let o=s;o<t;++o){const s=e[o].trim();0!==s.length&&(this.module.FS.createPath(i,s,!0,!0),i=i+"/"+s)}return i}chdirToHome(){this.module.FS.chdir(this.home)}chdir(e){this.module.FS.chdir(this.home+"/"+e)}async zipAddFile(e,s){const t=this.module,i=t.lengthBytesUTF8(e)+1,o=t._malloc(i);t.stringToUTF8(e,o,i);const n=t.lengthBytesUTF8(s)+1,r=t._malloc(n);t.stringToUTF8(s,r,n);const a=this.module._zipfile_add(o,r,r);if(t._free(o),t._free(r),0!==a)throw new Error("Unable to add "+s+" into "+e)}}},{}],11:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0}),t.MessagesQueue=void 0;t.MessagesQueue=class{constructor(){i(this,"messages",[])}handler(e,s){this.messages.push({name:e,props:s})}sendTo(e){for(const s of this.messages)e(s.name,s.props);this.messages=[]}}},{}],12:[function(e,s,t){"use strict";function i(e,s,t){return(s=function(e){var s=function(e,s){if("object"!=typeof e||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var i=t.call(e,s||"default");if("object"!=typeof i)return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===s?String:Number)(e)}(e,"string");return"symbol"==typeof s?s:String(s)}(s))in e?Object.defineProperty(e,s,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[s]=t,e}Object.defineProperty(t,"__esModule",{value:!0}),t.CommandInterfaceOverTransportLayer=void 0;const o=e("../impl/ci-impl"),n=4194304;t.CommandInterfaceOverTransportLayer=class{constructor(e,s,t,n){i(this,"startedAt",Date.now()),i(this,"frameWidth",0),i(this,"frameHeight",0),i(this,"rgb",null),i(this,"rgba",null),i(this,"freq",0),i(this,"utf8Decoder",new TextDecoder),i(this,"init",void 0),i(this,"transport",void 0),i(this,"ready",void 0),i(this,"persistPromise",void 0),i(this,"persistResolve",void 0),i(this,"exitPromise",void 0),i(this,"exitResolve",void 0),i(this,"eventsImpl",new o.CommandInterfaceEventsImpl),i(this,"keyMatrix",{}),i(this,"configPromise",void 0),i(this,"configResolve",(()=>{})),i(this,"panicMessages",[]),i(this,"connectPromise",null),i(this,"connectResolve",(()=>{})),i(this,"connectReject",(()=>{})),i(this,"disconnectPromise",null),i(this,"disconnectResolve",(()=>{})),i(this,"asyncifyStatsPromise",null),i(this,"asyncifyStatsResolve",(()=>{})),i(this,"fsTreePromise",null),i(this,"fsTreeResolve",(()=>{})),i(this,"fsGetFilePromise",{}),i(this,"fsGetFileResolve",{}),i(this,"fsGetFileParts",{}),i(this,"dataChunkPromise",{}),i(this,"dataChunkResolve",{}),i(this,"options",void 0),this.options=n,this.init=e,this.transport=s,this.ready=t,this.configPromise=new Promise((e=>this.configResolve=e)),this.transport.initMessageHandler(this.onServerMessage.bind(this))}sendClientMessage(e,s,t){(s=s||{}).sessionId=s.sessionId||this.transport.sessionId,this.transport.sendMessageToServer(e,s,t)}onServerMessage(e,s){if(!(void 0===e||e.length<3||"w"!==e[0]||"s"!==e[1]||"-"!==e[2])&&void 0!==s&&s.sessionId===this.transport.sessionId)switch(e){case"ws-ready":{const e=async()=>{if(!this.init||0===this.init.length)return;const e=new TextEncoder,s=async(e,s,t)=>{await this.sendDataChunk({type:e,name:s,data:t.buffer}),await this.sendDataChunk({type:e,name:s,data:null})};let t=0;for(const i of this.init)if(ArrayBuffer.isView(i))await s("bundle",t+"",i),t++;else if("string"==typeof i)await s("file",".jsdos/dosbox.conf",e.encode(i));else{const t=i,o=i;void 0!==o.jsdosConf.version?(await s("file",".jsdos/dosbox.conf",e.encode(o.dosboxConf)),await s("file",".jsdos/jsdos.json",e.encode(JSON.stringify(o.jsdosConf,null,2)))):void 0!==t.path&&await s("file",t.path,t.contents)}};e().then((()=>{this.sendClientMessage("wc-run",{token:this.options.token})})).catch((e=>{this.onErr("panic","Can't send bundles to backend: "+e.message),console.error(e)})).finally((()=>{delete this.init}))}break;case"ws-server-ready":this.panicMessages.length>0?(void 0!==this.transport.exit&&this.transport.exit(),this.ready(new Error(JSON.stringify(this.panicMessages)))):this.ready(null),delete this.ready;break;case"ws-frame-set-size":this.onFrameSize(s.width,s.height);break;case"ws-update-lines":this.onFrameLines(s.lines,s.rgba);break;case"ws-exit":this.onExit();break;case"ws-log":this.onLog(s.tag,s.message);break;case"ws-warn":this.onWarn(s.tag,s.message);break;case"ws-err":this.onErr(s.tag,s.message);break;case"ws-stdout":this.onStdout(s.message);break;case"ws-persist":this.onPersist(s.bundle);break;case"ws-sound-init":this.onSoundInit(s.freq);break;case"ws-sound-push":this.onSoundPush(s.samples);break;case"ws-config":this.onConfig({dosboxConf:this.utf8Decoder.decode(s.dosboxConf),jsdosConf:JSON.parse(s.jsdosConf)});break;case"ws-sync-sleep":this.sendClientMessage("wc-sync-sleep",s);break;case"ws-connected":this.connectResolve(),this.connectPromise=null,this.connectResolve=()=>{},this.connectReject=()=>{},this.eventsImpl.fireNetworkConnected(s.networkType,s.address);break;case"ws-disconnected":null!==this.connectPromise?(this.connectReject(),this.connectPromise=null,this.connectResolve=()=>{},this.connectReject=()=>{}):(this.disconnectResolve(),this.disconnectPromise=null,this.disconnectResolve=()=>{}),this.eventsImpl.fireNetworkDisconnected(s.networkType);break;case"ws-extract-progress":this.options.onExtractProgress&&this.options.onExtractProgress(s.index,s.file,s.extracted,s.count);break;case"ws-asyncify-stats":this.asyncifyStatsResolve(s),this.asyncifyStatsResolve=()=>{},this.asyncifyStatsPromise=null;break;case"ws-fs-tree":this.fsTreeResolve(s.fsTree),this.fsTreeResolve=()=>{},this.fsTreePromise=null;break;case"ws-send-data-chunk":{const e=s.chunk,t=this.dataChunkKey(e);if("ok"===e.type)void 0!==this.dataChunkPromise[t]&&(this.dataChunkResolve[t](),delete this.dataChunkPromise[t],delete this.dataChunkResolve[t]);else if("file"===e.type)if(null===e.data){const s=this.mergeChunks(this.fsGetFileParts[e.name]);this.fsGetFileResolve[e.name](s),delete this.fsGetFilePromise[e.name],delete this.fsGetFileResolve[e.name]}else this.fsGetFileParts[e.name].push(new Uint8Array(e.data));else console.log("Unknown chunk type:",e.type)}break;default:console.log("Unknown server message (ws):",e)}}onConfig(e){this.configResolve(e)}onFrameSize(e,s){this.frameWidth===e&&this.frameHeight===s||(this.frameWidth=e,this.frameHeight=s,this.rgb=new Uint8Array(e*s*3),this.eventsImpl.fireFrameSize(e,s))}onFrameLines(e,s){for(const s of e)this.rgb.set(s.heapu8,s.start*this.frameWidth*3);this.eventsImpl.fireFrame(this.rgb,this.rgba)}onSoundInit(e){this.freq=e}onSoundPush(e){this.eventsImpl.fireSoundPush(e)}onLog(e,s){this.eventsImpl.fireMessage("log","["+e+"]"+s)}onWarn(e,s){this.eventsImpl.fireMessage("warn","["+e+"]"+s)}onErr(e,s){"panic"===e&&(this.panicMessages.push(s),console.error("["+e+"]"+s)),this.eventsImpl.fireMessage("error","["+e+"]"+s)}onStdout(e){this.eventsImpl.fireStdout(e)}config(){return this.configPromise}width(){return this.frameWidth}height(){return this.frameHeight}soundFrequency(){return this.freq}screenshot(){if(null!==this.rgb||null!==this.rgba){const e=new Uint8ClampedArray(this.frameWidth*this.frameHeight*4),s=null!==this.rgb?this.rgb:this.rgba;let t=0,i=0;for(;i<e.length;)e[i++]=s[t++],e[i++]=s[t++],e[i++]=s[t++],e[i++]=255,s.length===e.length&&t++;return Promise.resolve(new ImageData(e,this.frameWidth,this.frameHeight))}return Promise.reject(new Error("No frame received"))}simulateKeyPress(){const e=Date.now()-this.startedAt;for(var s=arguments.length,t=new Array(s),i=0;i<s;i++)t[i]=arguments[i];t.forEach((s=>this.addKey(s,!0,e))),t.forEach((s=>this.addKey(s,!1,e+16)))}sendKeyEvent(e,s){this.addKey(e,s,Date.now()-this.startedAt)}addKey(e,s,t){!0===this.keyMatrix[e]!==s&&(this.keyMatrix[e]=s,this.sendClientMessage("wc-add-key",{key:e,pressed:s,timeMs:t}))}sendMouseMotion(e,s){this.sendClientMessage("wc-mouse-move",{x:e,y:s,relative:!1,timeMs:Date.now()-this.startedAt})}sendMouseRelativeMotion(e,s){this.sendClientMessage("wc-mouse-move",{x:e,y:s,relative:!0,timeMs:Date.now()-this.startedAt})}sendMouseButton(e,s){this.sendClientMessage("wc-mouse-button",{button:e,pressed:s,timeMs:Date.now()-this.startedAt})}sendMouseSync(){this.sendClientMessage("wc-mouse-sync",{timeMs:Date.now()-this.startedAt})}sendBackendEvent(e){this.sendClientMessage("wc-backend-event",{json:JSON.stringify(e)})}persist(e){if(void 0!==this.persistPromise)return this.persistPromise;const s=new Promise((e=>{this.persistResolve=e}));return this.persistPromise=s,this.sendClientMessage("wc-pack-fs-to-bundle",{onlyChanges:!1!==e}),s}onPersist(e){this.persistResolve&&(this.persistResolve(e),delete this.persistPromise,delete this.persistResolve)}pause(){this.sendClientMessage("wc-pause")}resume(){this.sendClientMessage("wc-resume")}mute(){this.sendClientMessage("wc-mute")}unmute(){this.sendClientMessage("wc-unmute")}exit(){return void 0!==this.exitPromise||(this.exitPromise=new Promise((e=>this.exitResolve=e)),this.exitPromise.then((()=>{this.events().fireExit()})),this.resume(),this.sendClientMessage("wc-exit")),this.exitPromise}onExit(){void 0!==this.transport.exit&&this.transport.exit(),this.exitResolve&&(this.exitResolve(),delete this.exitPromise,delete this.exitResolve)}events(){return this.eventsImpl}networkConnect(e,s){return null!==this.connectPromise||null!==this.disconnectPromise?Promise.reject(new Error("Already prefoming connection or disconnection...")):(this.connectPromise=new Promise(((t,i)=>{s.startsWith("wss://")||s.startsWith("ws://")||(s=("http:"===window.location.protocol?"ws://":"wss://")+s),this.connectResolve=t,this.connectReject=i,this.sendClientMessage("wc-connect",{networkType:e,address:s})})),this.connectPromise)}networkDisconnect(e){return null!==this.connectPromise||null!==this.disconnectPromise?Promise.reject(new Error("Already prefoming connection or disconnection...")):(this.disconnectPromise=new Promise((s=>{this.disconnectResolve=s,this.sendClientMessage("wc-disconnect",{networkType:e})})),this.disconnectPromise)}asyncifyStats(){if(null!==this.asyncifyStatsPromise)return this.asyncifyStatsPromise;const e=new Promise((e=>{this.asyncifyStatsResolve=e}));return this.asyncifyStatsPromise=e,this.sendClientMessage("wc-asyncify-stats",{}),e}fsTree(){if(null!==this.fsTreePromise)return this.fsTreePromise;const e=new Promise((e=>{this.fsTreeResolve=e}));return this.fsTreePromise=e,this.sendClientMessage("wc-fs-tree"),e}async fsReadFile(e){if(void 0!==this.fsGetFilePromise[e])throw new Error("fsGetFile should not be called twice for same file");const s=new Promise((s=>{this.fsGetFileResolve[e]=s}));return this.fsGetFilePromise[e]=s,this.fsGetFileParts[e]=[],this.sendClientMessage("wc-fs-get-file",{file:e}),s}async fsWriteFile(e,s){if(ArrayBuffer.isView(s))await this.sendDataChunk({type:"file",name:e,data:s.buffer});else{const t=s.getReader();for(;;){const s=await t.read();if(void 0!==s.value&&await this.sendDataChunk({type:"file",name:e,data:s.value.buffer}),s.done)break}}await this.sendDataChunk({type:"file",name:e,data:null})}async fsDeleteFile(e){throw new Error("not implemented")}async sendDataChunk(e){if(null===e.data||e.data.byteLength<=n)return this.sendFullDataChunk(e);{let s=0;for(;s<e.data.byteLength;)await this.sendFullDataChunk({type:e.type,name:e.name,data:e.data.slice(s,Math.min(e.data.byteLength,s+n))}),s+=n}}async sendFullDataChunk(e){const s=this.dataChunkKey(e);if(void 0!==this.dataChunkPromise[s])throw new Error("sendDataChunk should be accepted before sending new one");const t=new Promise((e=>{this.dataChunkResolve[s]=e}));return this.dataChunkPromise[s]=t,this.sendClientMessage("wc-send-data-chunk",{chunk:e},null===e.data?void 0:[e.data]),t}dataChunkKey(e){return e.name}mergeChunks(e){if(1===e.length)return e[0];let s=0;for(const t of e)s+=t.byteLength;const t=new Uint8Array(s);s=0;for(const i of e)t.set(i,s),s+=i.byteLength;return t}}},{"../impl/ci-impl":7}]},{},[5]);
2
+ //# sourceMappingURL=emulators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["node_modules/browser-pack/_prelude.js","emulators.js","src/build.ts","src/dos/bundle/dos-bundle.ts","src/dos/dosbox/ts/direct.ts","src/dos/dosbox/ts/worker.ts","src/emulators.ts","src/http.ts","src/impl/ci-impl.ts","src/impl/emulators-impl.ts","src/impl/modules.ts","src/libzip/libzip.ts","src/protocol/messages-queue.ts","src/protocol/protocol.ts"],"names":["r","e","n","t","o","i","f","c","require","u","a","Error","code","p","exports","call","length","module","Object","defineProperty","value","Build","version","buildSeed","size","gzSize","_defineProperty","obj","key","arg","input","hint","prim","Symbol","toPrimitive","undefined","res","TypeError","String","Number","_toPrimitive","_toPropertyKey","enumerable","configurable","writable","__importDefault","mod","__esModule","default","defaultConfig","libzip_1","http_1","build_1","constructor","libzipWasm","this","sources","autoexec","index","dosboxConf","indexOf","_len","arguments","lines","Array","_key","substring","join","extract","url","path","type","extractAll","push","async","overwriteConfig","instantiate","libzip","promises","source","resource","httpRequest","responseType","then","buffer","data","Uint8Array","writeFile","readmeTxt","JSON","stringify","jsdosConf","resources","Promise","all","zipToFs","bundle","zipFromFs","destroy","replace","dosDirect","messages_queue_1","wasmModule","sessionId","messagesQueue","MessagesQueue","handler","bind","name","props","sleepHandler","postMessage","transportLayer","sendMessageToServer","messageHandler","initMessageHandler","newHandler","sendTo","exit","window","removeEventListener","addEventListener","passive","callMain","dosWorker","workerUrl","response","fetch","status","statusText","localUrl","URL","createObjectURL","blob","worker","Worker","onerror","filename","message","onmessage","transfer","revokeObjectURL","terminate","global","NetworkType","emulators_impl_1","emulators","self","options","resolve","reject","Xhr","success","fail","method","makeHttpRequest","progressListner","errorListener","xhr","XMLHttpRequest","open","setRequestHeader","overrideMimeType","evt","total","loaded","progress","onreadystatechange","onReadyStateChange","send","readyState","Math","max","CommandInterfaceEventsImpl","_this","consumer","onStdoutConsumers","next","delayedStdout","fireStdout","onFrameSizeConsumers","onFrameConsumers","onSoundPushConsumers","onExitConsumers","onMessageConsumers","delayedMessages","msgType","args","width","height","rgb","rgba","samples","networkType","address","onNetworkConnectedConsumers","onNetworkDisconnectedConsumers","onNetworkConnected","onNetworkDisconnected","modules_1","dos_bundle_1","direct_1","worker_1","protocol_1","modules","wasmModules","readFile","parse","config","zipAddFile","init","dosboxDirect","dosboxWasm","dosbox","Date","now","backend","pathPrefix","wdosboxJs","dosboxXDirect","dosboxxWasm","dosboxx","wdosboxxJs","ci","CommandInterfaceOverTransportLayer","isArray","err","setTimeout","wasmModulesPromise","WasmModulesImpl","make","dosboxWorker","loadWasmModule","host","globals","compiled","WebAssembly","compile","wmodule","Module","of","wasmSupported","Instance","imul","b","al","bl","fround","x","clz32","trunc","ceil","floor","moduleName","onprogress","emModule","compiledModulePromise","CompiledNodeModule","loadWasmModuleNode","load","fromIndex","lastIndexOf","wIndex","isWasmUrl","wasmUrl","substr","binaryPromise","scriptPromise","binary","script","instantiateWasm","info","receiveInstance","env","instance","eval","CompiledBrowserModule","promise","loadWasmModuleBrowser","libzipPromise","loadModule","dosboxPromise","dosboxxPromise","initialModule","onRuntimeInitialized","home","FS","ignorePermissions","chdirToHome","changedAfterMs","ptr","_zip_from_fs","HEAPU32","archive","HEAPU8","slice","_free","zipArchive","filter","normalizeFilename","pathParts","split","createPath","chdir","withFilter","filterBuffer","filterLength","stringToUTF8","bytes","_malloc","set","retcode","_zip_to_fs","file","body","ArrayBuffer","parts","trim","encoding","exists","lookupPath","_libzip_destroy","RegExp","begin","end","part","archiveLength","archiveBuffer","fileLength","fileBuffer","ret","_zipfile_add","messages","ci_impl_1","maxDataChunkSize","transport","ready","TextDecoder","configPromise","configResolve","onServerMessage","sendClientMessage","sendBundles","encoder","TextEncoder","sendData","contents","sendDataChunk","bundleIndex","isView","encode","fileEntry","dosConfig","token","catch","onErr","console","error","finally","panicMessages","onFrameSize","onFrameLines","onExit","onLog","tag","onWarn","onStdout","onPersist","onSoundInit","freq","onSoundPush","onConfig","utf8Decoder","decode","connectResolve","connectPromise","connectReject","eventsImpl","fireNetworkConnected","disconnectResolve","disconnectPromise","fireNetworkDisconnected","onExtractProgress","extracted","count","asyncifyStatsResolve","asyncifyStatsPromise","fsTreeResolve","fsTree","fsTreePromise","chunk","dataChunkKey","dataChunkPromise","dataChunkResolve","mergeChunks","fsGetFileParts","fsGetFileResolve","fsGetFilePromise","log","frameWidth","frameHeight","fireFrameSize","rgbaPtr","line","heapu8","start","fireFrame","fireSoundPush","fireMessage","soundFrequency","screenshot","Uint8ClampedArray","frame","frameOffset","rgbaOffset","ImageData","simulateKeyPress","timeMs","startedAt","keyCodes","forEach","keyCode","addKey","sendKeyEvent","pressed","keyMatrix","sendMouseMotion","y","relative","sendMouseRelativeMotion","sendMouseButton","button","sendMouseSync","sendBackendEvent","payload","json","persist","onlyChanges","persistPromise","persistResolve","pause","resume","mute","unmute","exitPromise","exitResolve","events","fireExit","networkConnect","startsWith","location","protocol","networkDisconnect","asyncifyStats","reader","getReader","result","read","done","byteLength","sendFullDataChunk","pos","min","merged"],"mappings":"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","file":"emulators.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()",null,"\n/* eslint-disable */\n// Autogenerated\n// -------------\n// gulpfile.ts/wasm.ts --> generateBuildInfo\n\nexport const Build = {\n version: \"8.1.3 (efad5b97a9ef969bca0bab3dfe583ea1)\",\n buildSeed: 1718003991837,\n \"wdosbox-x.wasm\": {\n \"size\": 6528995,\n \"gzSize\": 2295538\n },\n \"wdosbox-x.js\": {\n \"size\": 252241,\n \"gzSize\": 59282\n },\n \"wdosbox.wasm\": {\n \"size\": 1465312,\n \"gzSize\": 498769\n },\n \"wdosbox.js\": {\n \"size\": 128411,\n \"gzSize\": 33707\n },\n \"wlibzip.wasm\": {\n \"size\": 111405,\n \"gzSize\": 51546\n },\n \"wlibzip.js\": {\n \"size\": 75391,\n \"gzSize\": 19757\n }\n,\n};\n","// # DosBundle\n// Is a complete bundle that contains everything needed to start dosbox server\n\nimport LibZip from \"../../libzip/libzip\";\n\nimport { httpRequest } from \"../../http\";\n\nimport { WasmModule } from \"../../impl/modules\";\nimport { Build } from \"../../build\";\n\n// ### DosArchiveSource\nexport interface DosArchiveSource {\n // source (archive) to download and extract via `extractAll`\n\n // **url** where archive is located\n url: string;\n\n // **path**\n path: string;\n\n // **type**\n type?: \"zip\";\n // archive type, now only Zip is supported\n}\n\nexport default class DosBundle {\n public dosboxConf = defaultConfig;\n public jsdosConf = {\n version: Build.version,\n };\n public sources: DosArchiveSource[];\n\n private libzipWasm: WasmModule;\n\n constructor(libzipWasm: WasmModule) {\n this.sources = [];\n this.libzipWasm = libzipWasm;\n }\n\n autoexec(...lines: string[]): DosBundle {\n const index = this.dosboxConf.indexOf(\"[autoexec]\");\n this.dosboxConf = this.dosboxConf.substring(0, index) +\n \"[autoexec]\\nmount c .\\nc:\\n\" + lines.join(\"\\n\");\n return this;\n }\n\n extract(url: string, path = \"/\", type: \"zip\" = \"zip\"): DosBundle {\n // simplified version of extractAll, works only for one archive. It calls extractAll inside.\n return this.extractAll([{ url, path, type }]);\n }\n\n extractAll(sources: DosArchiveSource[]): DosBundle {\n // eslint-disable-next-line max-len\n // download given [`sources`](https://js-dos.com/6.22/docs/api/generate.html?page=jsdos-bundle#dosfs-dosarchivesource)\n // and extract them\n this.sources.push(...sources);\n return this;\n }\n\n async toUint8Array(overwriteConfig = false): Promise<Uint8Array> {\n const module = {};\n await this.libzipWasm.instantiate(module);\n const libzip = new LibZip(module);\n\n const promises = [];\n for (const source of this.sources) {\n if (source.type !== \"zip\") {\n throw new Error(\"Only Zip is supported\");\n }\n\n const resource = httpRequest(source.url, {\n responseType: \"arraybuffer\",\n }).then((buffer: string | ArrayBuffer) => {\n return {\n source,\n data: new Uint8Array(buffer as ArrayBuffer),\n };\n });\n\n promises.push(resource);\n }\n\n if (!overwriteConfig) {\n await libzip.writeFile(\".jsdos/dosbox.conf\", this.dosboxConf);\n await libzip.writeFile(\".jsdos/readme.txt\", readmeTxt);\n await libzip.writeFile(\".jsdos/jsdos.json\", JSON.stringify(this.jsdosConf, null, 2));\n }\n\n const resources = await Promise.all(promises);\n for (const resource of resources) {\n libzip.zipToFs(resource.data, resource.source.path);\n }\n\n if (overwriteConfig) {\n await libzip.writeFile(\".jsdos/dosbox.conf\", this.dosboxConf);\n await libzip.writeFile(\".jsdos/readme.txt\", readmeTxt);\n await libzip.writeFile(\".jsdos/jsdos.json\", JSON.stringify(this.jsdosConf, null, 2));\n }\n\n const bundle = await libzip.zipFromFs();\n libzip.destroy();\n\n return bundle;\n }\n}\n\n\nconst readmeTxt = `\nPlease visit our website:\n\n _ __\n (_)____ ____/ /___ _____ _________ ____ ___\n / / ___/_____/ __ / __ \\\\/ ___// ___/ __ \\\\/ __ \\`__ \\\\\n / (__ )_____/ /_/ / /_/ (__ )/ /__/ /_/ / / / / / /\n __/ /____/ \\\\__,_/\\\\____/____(_)___/\\\\____/_/ /_/ /_/\n /___/\n`.replace(/\\n/g, \"\\r\\n\");\n\n/* eslint-disable max-len */\nexport const defaultConfig = `[sdl]\nautolock=false\n\nfullscreen=false\nfulldouble=false\nfullresolution=original\nwindowresolution=original\noutput=surface\nsensitivity=100\nwaitonerror=true\npriority=higher,normal\nmapperfile=mapper-jsdos.map\nusescancodes=true\nvsync=false\n[dosbox]\nmachine=svga_s3\n\nlanguage=\ncaptures=capture\nmemsize=16\n[cpu]\ncore=auto\ncputype=auto\ncycles=auto\n\ncycleup=10\ncycledown=20\n[mixer]\nnosound=false\nrate=44100\n\nblocksize=1024\nprebuffer=20\n\n[render]\n# frameskip: How many frames DOSBox skips before drawing one.\n# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.\n# scaler: Scaler used to enlarge/enhance low resolution modes.\n# If 'forced' is appended, then the scaler will be used even if the result might not be desired.\n# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.\n\nframeskip=0\naspect=false\nscaler=none\n\n[midi]\n# mpu401: Type of MPU-401 to emulate.\n# Possible values: intelligent, uart, none.\n# mididevice: Device that will receive the MIDI data from MPU-401.\n# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.\n# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use.\n# See the README/Manual for more details.\n\nmpu401=intelligent\nmididevice=default\nmidiconfig=\n\n[sblaster]\n# sbtype: Type of Soundblaster to emulate. gb is Gameblaster.\n# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, gb, none.\n# sbbase: The IO address of the soundblaster.\n# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.\n# irq: The IRQ number of the soundblaster.\n# Possible values: 7, 5, 3, 9, 10, 11, 12.\n# dma: The DMA number of the soundblaster.\n# Possible values: 1, 5, 0, 3, 6, 7.\n# hdma: The High DMA number of the soundblaster.\n# Possible values: 1, 5, 0, 3, 6, 7.\n# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.\n# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.\n# Possible values: auto, cms, opl2, dualopl2, opl3, none.\n# oplemu: Provider for the OPL emulation. compat might provide better quality (see oplrate as well).\n# Possible values: default, compat, fast.\n# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).\n# Possible values: 44100, 49716, 48000, 32000, 22050, 16000, 11025, 8000.\n\nsbtype=sb16\nsbbase=220\nirq=7\ndma=1\nhdma=5\nsbmixer=true\noplmode=auto\noplemu=default\noplrate=44100\n\n[gus]\n# gus: Enable the Gravis Ultrasound emulation.\n# gusrate: Sample rate of Ultrasound emulation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# gusbase: The IO base address of the Gravis Ultrasound.\n# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.\n# gusirq: The IRQ number of the Gravis Ultrasound.\n# Possible values: 5, 3, 7, 9, 10, 11, 12.\n# gusdma: The DMA channel of the Gravis Ultrasound.\n# Possible values: 3, 0, 1, 5, 6, 7.\n# ultradir: Path to Ultrasound directory. In this directory\n# there should be a MIDI directory that contains\n# the patch files for GUS playback. Patch sets used\n# with Timidity should work fine.\n\ngus=false\ngusrate=44100\ngusbase=240\ngusirq=5\ngusdma=3\nultradir=C:\\\\ULTRASND\n\n[speaker]\n# pcspeaker: Enable PC-Speaker emulation.\n# pcrate: Sample rate of the PC-Speaker sound generation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.\n# Possible values: auto, on, off.\n# tandyrate: Sample rate of the Tandy 3-Voice generation.\n# Possible values: 44100, 48000, 32000, 22050, 16000, 11025, 8000, 49716.\n# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).\n\npcspeaker=true\npcrate=44100\ntandy=auto\ntandyrate=44100\ndisney=true\n\n[joystick]\n# joysticktype: Type of joystick to emulate: auto (default), none,\n# 2axis (supports two joysticks),\n# 4axis (supports one joystick, first joystick used),\n# 4axis_2 (supports one joystick, second joystick used),\n# fcs (Thrustmaster), ch (CH Flightstick).\n# none disables joystick emulation.\n# auto chooses emulation depending on real joystick(s).\n# (Remember to reset dosbox's mapperfile if you saved it earlier)\n# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.\n# timed: enable timed intervals for axis. Experiment with this option, if your joystick drifts (away).\n# autofire: continuously fires as long as you keep the button pressed.\n# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.\n# buttonwrap: enable button wrapping at the number of emulated buttons.\n\njoysticktype=auto\ntimed=true\nautofire=false\nswap34=false\nbuttonwrap=false\n\n[serial]\n# serial1: set type of device connected to com port.\n# Can be disabled, dummy, modem, nullmodem, directserial.\n# Additional parameters must be in the same line in the form of\n# parameter:value. Parameter for all types is irq (optional).\n# for directserial: realport (required), rxdelay (optional).\n# (realport:COM1 realport:ttyS0).\n# for modem: listenport (optional).\n# for nullmodem: server, rxdelay, txdelay, telnet, usedtr,\n# transparent, port, inhsocket (all optional).\n# Example: serial1=modem listenport:5000\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial2: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial3: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n# serial4: see serial1\n# Possible values: dummy, disabled, modem, nullmodem, directserial.\n\nserial1=dummy\nserial2=dummy\nserial3=disabled\nserial4=disabled\n\n[dos]\n# xms: Enable XMS support.\n# ems: Enable EMS support.\n# umb: Enable UMB support.\n# keyboardlayout: Language code of the keyboard layout (or none).\n\nxms=true\nems=true\numb=true\nkeyboardlayout=auto\n\n[ipx]\n# ipx: Enable ipx over UDP/IP emulation.\n\nipx=true\n[autoexec]\necho off\nmount c .\nc:\n\ntype jsdos~1/readme.txt\necho on\n\n# Generated using https://js-dos.com\n# █▀▀▀▀▀█ █ ▄▄▄▀▀█ █▀▀▀▀▀█\n# █ ███ █ ██▄ █ ▀ ▄ █ ███ █\n# █ ▀▀▀ █ ▄██ ▀ ▀▀█ █ ▀▀▀ █\n# ▀▀▀▀▀▀▀ ▀ █▄▀▄▀ █ ▀▀▀▀▀▀▀\n# █▀▄▄█▀▀▄▄ ▀ ▀█▄▄▄▄ ▀▄█▀█▀\n# █▀ ▀ ▀▀▄ █▀ ▄ ▄▀▀▀▄ █▀█▄\n# ▄ ▄▄ █▀▀▄ ▄▀▄▀▀█ ▀▀▄▀▀█▀\n# ▄▀▀█▀▀ █▀█▀█▀▀▄ ▀██▀█▄\n# ▀▀▀ ▀ ▀ █▄█ ▀█▄▄█▀▀▀█▀▀\n# █▀▀▀▀▀█ ▄▄▄ ▄ ▄ █ ▀ █▄▄▄▄\n# █ ███ █ ▀█▀▀▄▀▀▄████▀▀█▄█\n# █ ▀▀▀ █ ▄▀▀█▀█▀▄ ▀▀▄▄█▄█\n# ▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀\n`.replace(/\\n/g, \"\\r\\n\");\n\n/* eslint-enable max-len */\n","import { WasmModule } from \"../../../impl/modules\";\nimport { TransportLayer, MessageHandler, ClientMessage, ServerMessage } from \"../../../protocol/protocol\";\nimport { MessagesQueue } from \"../../../protocol/messages-queue\";\n\nexport async function dosDirect(wasmModule: WasmModule, sessionId: string): Promise<TransportLayer> {\n const messagesQueue = new MessagesQueue();\n let handler: MessageHandler = messagesQueue.handler.bind(messagesQueue);\n\n const module: any = {};\n\n module.postMessage = (name: ServerMessage, props: {[key: string]: any}) => {\n handler(name, props);\n };\n\n const sleepHandler = (e: MessageEvent) => {\n const data = e.data;\n if (data?.name === \"ws-sync-sleep\" && data.props.sessionId === sessionId) {\n postMessage({ name: \"wc-sync-sleep\", props: data.props }, \"*\");\n }\n };\n\n const transportLayer: TransportLayer = {\n sessionId,\n sendMessageToServer: (name: ClientMessage, props?: {[key: string]: any}) => {\n module.messageHandler({ data: { name, props } });\n },\n initMessageHandler: (newHandler: MessageHandler) => {\n handler = newHandler;\n messagesQueue.sendTo(handler);\n },\n exit: () => {\n if (typeof window !== \"undefined\") {\n window.removeEventListener(\"message\", sleepHandler);\n }\n },\n };\n\n (transportLayer as any).module = module;\n\n if (typeof window !== \"undefined\") {\n window.addEventListener(\"message\", sleepHandler, { passive: true });\n }\n\n await wasmModule.instantiate(module);\n module.callMain([sessionId]);\n\n return transportLayer;\n}\n","import { WasmModule } from \"../../../impl/modules\";\nimport { TransportLayer, MessageHandler, ClientMessage } from \"../../../protocol/protocol\";\nimport { MessagesQueue } from \"../../../protocol/messages-queue\";\n\nexport async function dosWorker(workerUrl: string,\n wasmModule: WasmModule,\n sessionId: string): Promise<TransportLayer> {\n const messagesQueue = new MessagesQueue();\n let handler: MessageHandler = messagesQueue.handler.bind(messagesQueue);\n\n const response = await fetch(workerUrl);\n if (response.status !== 200) {\n throw new Error(\"Unable to download '\" + workerUrl + \"' (\" +\n response.status + \"): \" + response.statusText);\n }\n const localUrl = URL.createObjectURL(await response.blob());\n const worker = new Worker(localUrl);\n worker.onerror = (e) => {\n handler(\"ws-err\", { type: e.type, filename: e.filename, message: e.message });\n };\n worker.onmessage = (e) => {\n const data = e.data;\n if (data?.name !== undefined) {\n handler(data.name, data.props);\n }\n };\n\n await wasmModule.instantiate({});\n\n const transportLayer: TransportLayer = {\n sessionId,\n sendMessageToServer: (name: ClientMessage,\n props: {[key: string]: any},\n transfer?: ArrayBuffer[]) => {\n if (transfer) {\n worker.postMessage({ name, props }, transfer);\n } else {\n worker.postMessage({ name, props });\n }\n },\n initMessageHandler: (newHandler: MessageHandler) => {\n handler = newHandler;\n messagesQueue.sendTo(handler);\n },\n exit: () => {\n URL.revokeObjectURL(localUrl);\n worker.terminate();\n },\n };\n\n try {\n transportLayer.sendMessageToServer(\"wc-install\", {\n module: (wasmModule as any).wasmModule,\n sessionId,\n });\n } catch (e) {\n transportLayer.sendMessageToServer(\"wc-install\", { sessionId });\n }\n\n return transportLayer;\n}\n","import DosBundle from \"./dos/bundle/dos-bundle\";\nimport emulatorsImpl from \"./impl/emulators-impl\";\n\nimport { AsyncifyStats, TransportLayer, FsNode } from \"./protocol/protocol\";\n\nexport interface DosConfig {\n dosboxConf: string,\n jsdosConf: {\n version: string,\n },\n};\n\n/* eslint-disable no-unused-vars */\nexport enum NetworkType {\n NETWORK_DOSBOX_IPX = 0,\n}\n/* eslint-enable no-unused-vars */\n\nexport interface BackendOptions {\n token?: string | undefined;\n onExtractProgress?: (bundleIndex: number, file: string, extracted: number, total: number) => void;\n}\n\nexport type InitBundleEntry = Uint8Array;\nexport interface InitFileEntry {\n path: string,\n contents: Uint8Array,\n};\nexport type InitFsEntry = InitBundleEntry | InitFileEntry | DosConfig | string;\nexport type InitFs = InitFsEntry | InitFsEntry[];\n\nexport interface Emulators {\n // * pathPrefix - by default emulators will load wasm modules relatively from current path,\n // you should specify path prefix if you want to load them from different place\n pathPrefix: string;\n\n // * version - version of emulators build\n version: string;\n\n // * wdosboxJs - a file name to load\n wdosboxJs: string;\n\n // * dosBundle - create empty DosBundle\n bundle: () => Promise<DosBundle>;\n\n // * dosConfig - read bundle config\n bundleConfig: (bundle: InitBundleEntry) => Promise<DosConfig | null>;\n\n // * updateDosConfig - update bunle config\n bundleUpdateConfig: (bundle: InitBundleEntry, config: DosConfig) => Promise<Uint8Array>;\n\n // * dosboxNode - create dosbox node emulator backend\n dosboxNode: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * dosboxDirect - create dosbox direct emulator backend\n dosboxDirect: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * dosboxWorker - create dosbox worker emulator backend\n dosboxWorker: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * dosboxXNode - create dosbox-x node emulator backend\n dosboxXNode: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * dosboxDirect - create dosbox-x direct emulator backend\n dosboxXDirect: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * dosboxWorker - create dosbox-x worker emulator backend\n dosboxXWorker: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;\n\n // * backend - create abstract emulation backend by given TransportLayer\n backend: (init: InitFs, transportLayer: TransportLayer,\n options?: BackendOptions) => Promise<CommandInterface>;\n}\n\nexport interface CommandInterface {\n // * get bundle config\n config: () => Promise<DosConfig>;\n\n // * current render buffer width\n height: () => number;\n\n // * current render buffer height\n width: () => number;\n\n // * sound frequency\n soundFrequency: () => number;\n\n // * `screenshot()` - get screnshot of canvas as ImageData\n screenshot: () => Promise<ImageData>;\n\n // * `pause()` - pause emulation (also mute all sounds)\n pause: () => void;\n\n // * `resume()` - resume emulation (also unmute all sounds)\n resume: () => void;\n\n // * `mute()` - mute all sounds\n mute: () => void;\n\n // * `unmute()` - unmute all sounds\n unmute: () => void;\n\n // * `exit()` - exit from runtime\n exit: () => Promise<void>;\n\n // * `simulateKeyPress(...keyCodes)` - allows to simulate key press **AND** release event for key code\n // see `sendKeyPress` to find meaning of keyCode. Key combination is supported when more than 1 keyCode is set.\n simulateKeyPress: (...keyCodes: number[]) => void;\n\n // * `sendKeyEvent(keyCode, pressed)` - sends single key (press or release) event to backend\n sendKeyEvent: (keyCode: number, pressed: boolean) => void;\n\n // * `sendMouseMotion` - sends mouse motion event to backend, position is in range [0, 1]\n sendMouseMotion: (x: number, y: number) => void;\n\n // * `sendRelativeMotion` - sends mouse motion event to backend, position is absolute diff of position\n sendMouseRelativeMotion: (x: number, y: number) => void;\n\n // * `simulateMouseButton` - sends mouse button event (press or release) to backend\n sendMouseButton: (button: number, pressed: boolean) => void;\n\n // * `sendMouseSync` - sends mouse sync event\n sendMouseSync: () => void;\n\n // * `sendBackendEvent` - send event for current backend, event will be stringified to json\n sendBackendEvent: (event: any) => void;\n\n // dump FS as Uint8Array <zip archive>\n persist(onlyChanges?: boolean): Promise<Uint8Array | null>;\n\n // events\n events(): CommandInterfaceEvents;\n\n networkConnect(networkType: NetworkType, address: string): Promise<void>;\n\n networkDisconnect(networkType: NetworkType): Promise<void>;\n\n asyncifyStats(): Promise<AsyncifyStats>;\n\n fsTree(): Promise<FsNode>;\n\n fsReadFile(file: string): Promise<Uint8Array>;\n\n fsWriteFile(file: string, contents: ReadableStream<Uint8Array> | Uint8Array): Promise<void>;\n\n fsDeleteFile(file: string): Promise<void>;\n\n}\n\nexport type MessageType = \"log\" | \"warn\" | \"error\" | string;\n\nexport interface CommandInterfaceEvents {\n onStdout: (consumer: (message: string) => void) => void;\n onFrameSize: (consumer: (width: number, height: number) => void) => void;\n onFrame: (consumer: (rgb: Uint8Array | null, rgba: Uint8Array | null) => void) => void;\n onSoundPush: (consumer: (samples: Float32Array) => void) => void;\n onExit: (consumer: () => void) => void;\n\n onMessage: (consumer: (msgType: MessageType, ...args: any[]) => void) => void;\n\n onNetworkConnected: (consumer: (networkType: NetworkType, address: string) => void) => void;\n onNetworkDisconnected: (consumer: (networkType: NetworkType) => void) => void;\n}\n\nif (typeof window !== \"undefined\") {\n (window as any).emulators = emulatorsImpl;\n} if (typeof global !== \"undefined\") {\n (global as any).emulators = emulatorsImpl;\n}\n","export interface XhrOptions {\n method?: string;\n progress?: (total: number, loaded: number) => void;\n data?: string;\n responseType?: XMLHttpRequestResponseType;\n}\n\nexport const httpRequest = XhrRequest;\n\n// # XhrRequest\n// `XhrRequest` is small wrapper over XMLHttpRequest, that provides some\n// handy methods\nfunction XhrRequest(url: string, options: XhrOptions): Promise<string | ArrayBuffer> {\n return new Promise<string | ArrayBuffer>((resolve, reject) => {\n new Xhr(url, {\n ...options,\n success: resolve,\n fail: (message: string) => {\n reject(new Error(message));\n },\n });\n });\n}\n\n// private implementation\ninterface XhrOptionsInternal extends XhrOptions {\n success?: (response: any) => void;\n fail?: (message: string) => void;\n}\n// * `success` - callback when resource is downloaded\n// * `fail` - fail callback\n\n\n// Class Xhr does not have any public methods\nclass Xhr {\n private resource: string;\n private options: XhrOptionsInternal;\n private xhr: XMLHttpRequest | null = null;\n private total = 0;\n private loaded = 0;\n\n constructor(url: string, options: XhrOptionsInternal) {\n this.resource = url;\n this.options = options;\n this.options.method = options.method || \"GET\";\n\n if (this.options.method !== \"GET\") {\n throw new Error(\"Method \" + this.options.method + \" is not supported\");\n }\n\n this.makeHttpRequest();\n }\n\n private makeHttpRequest() {\n this.xhr = new XMLHttpRequest();\n this.xhr.open(this.options.method || \"GET\", this.resource, true);\n if (this.options.method === \"POST\") {\n this.xhr.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n }\n this.xhr.overrideMimeType(\"text/plain; charset=x-user-defined\");\n\n let progressListner;\n if (typeof (progressListner = this.xhr).addEventListener === \"function\") {\n progressListner.addEventListener(\"progress\", (evt) => {\n this.total = evt.total;\n this.loaded = evt.loaded;\n if (this.options.progress) {\n return this.options.progress(evt.total, evt.loaded);\n }\n });\n }\n\n let errorListener;\n if (typeof (errorListener = this.xhr).addEventListener === \"function\") {\n errorListener.addEventListener(\"error\", () => {\n if (this.options.fail) {\n this.options.fail(\"Unalbe to download '\" + this.resource +\n \"', code: \" + (this.xhr as XMLHttpRequest).status);\n return delete this.options.fail;\n }\n });\n }\n this.xhr.onreadystatechange = () => {\n return this.onReadyStateChange();\n };\n if (this.options.responseType) {\n this.xhr.responseType = this.options.responseType;\n }\n this.xhr.send(this.options.data);\n }\n\n private onReadyStateChange() {\n const xhr = (this.xhr as XMLHttpRequest);\n if (xhr.readyState === 4) {\n if (xhr.status === 200) {\n if (this.options.success) {\n const total = Math.max(this.total, this.loaded);\n if (this.options.progress !== undefined) {\n this.options.progress(total, total);\n }\n\n return this.options.success(xhr.response);\n }\n } else if (this.options.fail) {\n this.options.fail(\"Unable to download '\" + this.resource + \"', code: \" + xhr.status);\n return delete this.options.fail;\n }\n }\n }\n}\n\n","/* eslint-disable no-invalid-this */\n\nimport { CommandInterfaceEvents, MessageType, NetworkType } from \"../emulators\";\n\nexport class CommandInterfaceEventsImpl implements CommandInterfaceEvents {\n private onStdoutConsumers: ((message: string) => void)[] = [];\n private delayedStdout: string[] = [];\n\n private onFrameSizeConsumers: ((width: number, height: number) => void)[] = [];\n private onFrameConsumers: ((rgb: Uint8Array | null, rgba: Uint8Array | null) => void)[] = [];\n private onSoundPushConsumers: ((samples: Float32Array) => void)[] = [];\n private onExitConsumers: (() => void)[] = [];\n\n private onMessageConsumers: ((msgType: MessageType, ...args: any[]) => void)[] = [];\n private delayedMessages: {msgType: MessageType, args: any[]}[] = [];\n\n private onNetworkConnectedConsumers: ((networkType: NetworkType, address: string) => void)[] = [];\n private onNetworkDisconnectedConsumers: ((networkType: NetworkType) => void)[] = [];\n\n onStdout = (consumer: (message: string) => void) => {\n this.onStdoutConsumers.push(consumer);\n\n if (this.onStdoutConsumers.length === 1) {\n for (const next of this.delayedStdout) {\n this.fireStdout(next);\n }\n this.delayedStdout = [];\n }\n };\n\n onFrameSize = (consumer: (width: number, height: number) => void) => {\n this.onFrameSizeConsumers.push(consumer);\n };\n\n onFrame = (consumer: (rgb: Uint8Array | null, rgba: Uint8Array | null) => void) => {\n this.onFrameConsumers.push(consumer);\n };\n\n onSoundPush = (consumer: (samples: Float32Array) => void) => {\n this.onSoundPushConsumers.push(consumer);\n };\n\n onExit = (consumer: () => void) => {\n this.onExitConsumers.push(consumer);\n };\n\n onMessage = (consumer: (msgType: MessageType, ...args: any[]) => void) => {\n this.onMessageConsumers.push(consumer);\n\n if (this.onMessageConsumers.length === 1) {\n for (const next of this.delayedMessages) {\n consumer(next.msgType, ...next.args);\n }\n this.delayedMessages = [];\n }\n };\n\n onNetworkConnected(consumer: (networkType: NetworkType, address: string) => void) {\n this.onNetworkConnectedConsumers.push(consumer);\n }\n\n onNetworkDisconnected(consumer: (networkType: NetworkType) => void) {\n this.onNetworkDisconnectedConsumers.push(consumer);\n }\n\n fireStdout = (message: string) => {\n if (this.onStdoutConsumers.length === 0) {\n this.delayedStdout.push(message);\n return;\n }\n\n for (const next of this.onStdoutConsumers) {\n next(message);\n }\n };\n\n fireFrameSize = (width: number, height: number) => {\n for (const next of this.onFrameSizeConsumers) {\n next(width, height);\n }\n };\n\n fireFrame = (rgb: Uint8Array | null, rgba: Uint8Array | null) => {\n for (const next of this.onFrameConsumers) {\n next(rgb, rgba);\n }\n };\n\n fireSoundPush = (samples: Float32Array) => {\n for (const next of this.onSoundPushConsumers) {\n next(samples);\n }\n };\n\n fireExit = () => {\n for (const next of this.onExitConsumers) {\n next();\n }\n\n this.onStdoutConsumers = [];\n this.onFrameSizeConsumers = [];\n this.onFrameConsumers = [];\n this.onSoundPushConsumers = [];\n this.onExitConsumers = [];\n this.onMessageConsumers = [];\n };\n\n fireMessage = (msgType: MessageType, ...args: any[]) => {\n if (this.onMessageConsumers.length === 0) {\n this.delayedMessages.push({ msgType, args });\n return;\n }\n\n for (const next of this.onMessageConsumers) {\n next(msgType, ...args);\n }\n };\n\n fireNetworkConnected = (networkType: NetworkType, address: string) => {\n for (const next of this.onNetworkConnectedConsumers) {\n next(networkType, address);\n }\n };\n\n fireNetworkDisconnected = (networkType: NetworkType) => {\n for (const next of this.onNetworkDisconnectedConsumers) {\n next(networkType);\n }\n };\n}\n","import { Build } from \"../build\";\nimport { Emulators, CommandInterface, BackendOptions, DosConfig, InitFs, InitBundleEntry } from \"../emulators\";\n\nimport { IWasmModules, WasmModulesImpl } from \"./modules\";\n\nimport DosBundle from \"../dos/bundle/dos-bundle\";\nimport { dosDirect } from \"../dos/dosbox/ts/direct\";\nimport { dosWorker } from \"../dos/dosbox/ts/worker\";\n\nimport { TransportLayer, CommandInterfaceOverTransportLayer } from \"../protocol/protocol\";\nimport LibZip from \"../libzip/libzip\";\n\nclass EmulatorsImpl implements Emulators {\n pathPrefix = \"\";\n version = Build.version;\n wdosboxJs = \"wdosbox.js\";\n wdosboxxJs = \"wdosbox-x.js\";\n\n private wasmModulesPromise?: Promise<IWasmModules>;\n\n async bundle(): Promise<DosBundle> {\n const modules = await this.wasmModules();\n const libzipWasm = await modules.libzip();\n return new DosBundle(libzipWasm);\n }\n\n async bundleConfig(bundle: InitBundleEntry): Promise<DosConfig | null> {\n const modules = await this.wasmModules();\n const libzipWasm = await modules.libzip();\n\n const module = {};\n await libzipWasm.instantiate(module);\n const libzip = new LibZip(module);\n\n try {\n libzip.zipToFs(bundle, \"/\", \".jsdos/\");\n try {\n const dosboxConf = (await libzip.readFile(\".jsdos/dosbox.conf\")) as string;\n try {\n const jsdosConf = (await libzip.readFile(\".jsdos/jsdos.json\")) as string;\n return {\n dosboxConf,\n jsdosConf: JSON.parse(jsdosConf),\n };\n } catch (e) {\n // ignore\n }\n return {\n dosboxConf,\n jsdosConf: {\n version: Build.version,\n },\n };\n } catch (e) {\n // ignore\n }\n return null;\n } finally {\n libzip.destroy();\n }\n }\n\n async bundleUpdateConfig(bundle: InitBundleEntry, config: DosConfig): Promise<Uint8Array> {\n const modules = await this.wasmModules();\n const libzipWasm = await modules.libzip();\n\n const module = {};\n await libzipWasm.instantiate(module);\n const libzip = new LibZip(module);\n\n try {\n await libzip.writeFile(\"bundle.zip\", bundle);\n await libzip.writeFile(\".jsdos/dosbox.conf\", config.dosboxConf);\n await libzip.writeFile(\".jsdos/jsdos.json\", JSON.stringify(config.jsdosConf));\n await libzip.zipAddFile(\"bundle.zip\", \".jsdos/jsdos.json\");\n await libzip.zipAddFile(\"bundle.zip\", \".jsdos/dosbox.conf\");\n return (await libzip.readFile(\"bundle.zip\", \"binary\")) as Uint8Array;\n } finally {\n libzip.destroy();\n }\n }\n\n async dosboxNode(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n return this.dosboxDirect(init, options);\n }\n\n async dosboxDirect(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n const modules = await this.wasmModules();\n const dosboxWasm = await modules.dosbox();\n const transportLayer = await dosDirect(dosboxWasm, \"session-\" + Date.now());\n return this.backend(init, transportLayer, options);\n }\n\n async dosboxWorker(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n const modules = await this.wasmModules();\n const dosboxWasm = await modules.dosbox();\n const transportLayer = await dosWorker(this.pathPrefix + this.wdosboxJs, dosboxWasm, \"session-\" + Date.now());\n return this.backend(init, transportLayer, options);\n }\n\n async dosboxXNode(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n return this.dosboxXDirect(init, options);\n }\n\n async dosboxXDirect(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n const modules = await this.wasmModules();\n const dosboxxWasm = await modules.dosboxx();\n const transportLayer = await dosDirect(dosboxxWasm, \"session-\" + Date.now());\n return this.backend(init, transportLayer, options);\n }\n\n async dosboxXWorker(init: InitFs, options?: BackendOptions): Promise<CommandInterface> {\n const modules = await this.wasmModules();\n const dosboxxWasm = await modules.dosboxx();\n const transportLayer = await dosWorker(this.pathPrefix + this.wdosboxxJs, dosboxxWasm, \"session-\" + Date.now());\n return this.backend(init, transportLayer, options);\n }\n\n async backend(init: InitFs, transportLayer: TransportLayer,\n options?: BackendOptions): Promise<CommandInterface> {\n return new Promise<CommandInterface>((resolve, reject) => {\n const ci = new CommandInterfaceOverTransportLayer(\n Array.isArray(init) ? init : [init],\n transportLayer,\n (err) => {\n if (err !== null) {\n reject(err);\n } else {\n // can be called from ctor, without timeout can be undefined\n setTimeout(() => resolve(ci), 4);\n }\n },\n options || {},\n );\n });\n }\n\n wasmModules(): Promise<IWasmModules> {\n if (this.wasmModulesPromise !== undefined) {\n return this.wasmModulesPromise;\n }\n\n const make = async () => {\n return new WasmModulesImpl(this.pathPrefix, this.wdosboxJs, this.wdosboxxJs);\n };\n\n this.wasmModulesPromise = make();\n return this.wasmModulesPromise;\n }\n\n async dosDirect(init: InitFs): Promise<CommandInterface> {\n return this.dosboxDirect(init);\n }\n\n async dosWorker(init: InitFs): Promise<CommandInterface> {\n return this.dosboxWorker(init);\n }\n}\n\nconst emulators = new EmulatorsImpl();\n\nexport default emulators;\n","import { httpRequest } from \"../http\";\n\nexport interface WasmModule {\n instantiate: (module?: any) => Promise<any>;\n}\n\nexport interface IWasmModules {\n libzip: () => Promise<WasmModule>;\n dosbox: () => Promise<WasmModule>;\n dosboxx: () => Promise<WasmModule>;\n}\n\ninterface Globals {\n exports: {[moduleName: string]: any},\n compiled: {[moduleName: string]: Promise<WasmModule>},\n}\n\nclass Host {\n public wasmSupported = false;\n public globals: Globals;\n constructor() {\n this.globals = typeof window === \"undefined\" ? {} : window as any;\n if (!this.globals.exports) {\n this.globals.exports = {};\n }\n if (!this.globals.compiled) {\n this.globals.compiled = {};\n }\n\n // ### WebAssembly\n // Host able to detect is WebAssembly supported or not,\n // this information is stored in `Host.wasmSupported` variable\n if (typeof WebAssembly === \"object\" &&\n typeof WebAssembly.instantiate === \"function\" &&\n typeof WebAssembly.compile === \"function\") {\n const wmodule = new WebAssembly.Module(Uint8Array.of(0x0, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00));\n if (wmodule instanceof WebAssembly.Module) {\n this.wasmSupported = new WebAssembly.Instance(wmodule) instanceof WebAssembly.Instance;\n }\n }\n\n // Polyfill for old contains implementations for:\n // `Math.imul`, `Math.fround`, `Math.clz32`, `Math.trunc`\n (function polyfill() {\n if (!Math.imul || Math.imul(0xffffffff, 5) !== -5) {\n Math.imul = function imul(a: any, b: any) {\n const ah = a >>> 16;\n const al = a & 0xffff;\n const bh = b >>> 16;\n const bl = b & 0xffff;\n return (al * bl + ((ah * bl + al * bh) << 16)) | 0;\n };\n }\n Math.imul = Math.imul;\n\n if (!Math.fround) {\n Math.fround = function(x) {\n return x;\n };\n }\n Math.fround = Math.fround;\n\n if (!Math.clz32) {\n Math.clz32 = function(x) {\n x = x >>> 0;\n for (let i = 0; i < 32; i++) {\n if (x & (1 << (31 - i))) {\n return i;\n }\n }\n return 32;\n };\n }\n Math.clz32 = Math.clz32;\n\n if (!Math.trunc) {\n Math.trunc = function(x) {\n return x < 0 ? Math.ceil(x) : Math.floor(x);\n };\n }\n Math.trunc = Math.trunc;\n })();\n }\n}\n\nexport const host = new Host();\n\nexport class WasmModulesImpl implements IWasmModules {\n private pathPrefix: string;\n private wdosboxJs: string;\n private wdosboxxJs: string;\n\n private libzipPromise?: Promise<WasmModule>;\n private dosboxPromise?: Promise<WasmModule>;\n private dosboxxPromise?: Promise<WasmModule>;\n\n public wasmSupported = false;\n\n constructor(pathPrefix: string,\n wdosboxJs: string,\n wdosboxxJs: string) {\n if (pathPrefix.length > 0 && pathPrefix[pathPrefix.length - 1] !== \"/\") {\n pathPrefix += \"/\";\n }\n\n this.pathPrefix = pathPrefix;\n this.wdosboxJs = wdosboxJs;\n this.wdosboxxJs = wdosboxxJs;\n }\n\n libzip() {\n if (this.libzipPromise !== undefined) {\n return this.libzipPromise;\n }\n\n this.libzipPromise = this.loadModule(this.pathPrefix + \"wlibzip.js\", \"WLIBZIP\");\n return this.libzipPromise;\n }\n\n dosbox() {\n if (this.dosboxPromise !== undefined) {\n return this.dosboxPromise;\n }\n\n this.dosboxPromise = this.loadModule(this.pathPrefix + this.wdosboxJs, \"WDOSBOX\");\n\n return this.dosboxPromise;\n }\n\n dosboxx() {\n if (this.dosboxxPromise !== undefined) {\n return this.dosboxxPromise;\n }\n\n this.dosboxxPromise = this.loadModule(this.pathPrefix + this.wdosboxxJs, \"WDOSBOXX\");\n\n return this.dosboxxPromise;\n }\n\n private loadModule(url: string,\n moduleName: string) {\n // eslint-disable-next-line\n return loadWasmModule(url, moduleName, () => {});\n }\n}\n\nexport function loadWasmModule(url: string,\n moduleName: string,\n onprogress: (stage: string, total: number, loaded: number) => void,\n): Promise<WasmModule> {\n if (typeof XMLHttpRequest === \"undefined\") {\n return loadWasmModuleNode(url, moduleName, onprogress);\n } else {\n return loadWasmModuleBrowser(url, moduleName, onprogress);\n }\n}\n\nfunction loadWasmModuleNode(url: string,\n moduleName: string,\n // eslint-disable-next-line\n onprogress: (stage: string, total: number, loaded: number) => void) {\n if (host.globals.compiled[moduleName] !== undefined) {\n return host.globals.compiled[moduleName];\n }\n\n const emModule = require(url);\n const compiledModulePromise = Promise.resolve(new CompiledNodeModule(emModule));\n if (moduleName) {\n host.globals.compiled[moduleName] = compiledModulePromise;\n }\n\n return compiledModulePromise;\n}\n\nfunction loadWasmModuleBrowser(url: string,\n moduleName: string,\n onprogress: (stage: string, total: number, loaded: number) => void) {\n if (host.globals.compiled[moduleName] !== undefined) {\n return host.globals.compiled[moduleName];\n }\n\n async function load() {\n const fromIndex = url.lastIndexOf(\"/\");\n const wIndex = url.indexOf(\"w\", fromIndex);\n const isWasmUrl = wIndex === fromIndex + 1 && wIndex >= 0;\n\n if (!host.wasmSupported || !isWasmUrl) {\n throw new Error(\"Starting from js-dos 6.22.60 js environment is not supported\");\n }\n\n const wasmUrl = url.substr(0, url.lastIndexOf(\".js\")) + \".wasm\";\n const binaryPromise = httpRequest(wasmUrl, {\n responseType: \"arraybuffer\",\n progress: (total, loaded) => {\n onprogress(\"Resolving DosBox (\" + url + \")\", total, loaded);\n },\n });\n const scriptPromise = httpRequest(url, {\n progress: (total, loaded) => {\n onprogress(\"Resolving DosBox\", total, loaded);\n },\n });\n\n const [binary, script] = await Promise.all([binaryPromise, scriptPromise]);\n const wasmModule = await WebAssembly.compile(binary as ArrayBuffer);\n const instantiateWasm = (info: any, receiveInstance: any) => {\n info.env = info.env || {};\n WebAssembly.instantiate(wasmModule, info)\n .then((instance) => receiveInstance(instance, wasmModule));\n return; // no-return\n };\n\n eval.call(window, script as string);\n\n return new CompiledBrowserModule(wasmModule,\n host.globals.exports[moduleName],\n instantiateWasm);\n }\n\n const promise = load();\n\n if (moduleName) {\n host.globals.compiled[moduleName] = promise;\n }\n\n return promise;\n}\n\nclass CompiledNodeModule implements WasmModule {\n private emModule: any;\n constructor(emModule: any) {\n this.emModule = emModule;\n }\n\n instantiate(initialModule: any): Promise<void> {\n return new Promise<void>((resolve) => {\n initialModule.onRuntimeInitialized = () => {\n resolve();\n };\n\n // eslint-disable-next-line new-cap\n new this.emModule(initialModule);\n });\n }\n}\n\nclass CompiledBrowserModule implements WasmModule {\n public wasmModule: WebAssembly.Module;\n private module: any;\n private instantiateWasm: any;\n\n constructor(wasmModule: WebAssembly.Module, module: any, instantiateWasm: any) {\n this.wasmModule = wasmModule;\n this.module = module;\n this.instantiateWasm = instantiateWasm;\n }\n\n instantiate(initialModule: any): Promise<void> {\n return new Promise<void>((resolve) => {\n initialModule.instantiateWasm = this.instantiateWasm;\n initialModule.onRuntimeInitialized = () => {\n resolve();\n };\n // eslint-disable-next-line new-cap\n new this.module(initialModule);\n });\n }\n}\n","export default class LibZip {\n public module: any;\n private home: string;\n\n constructor(module: any, home: string = \"/home/web_user\") {\n this.module = module;\n this.home = home;\n this.module.callMain([]);\n this.module.FS.ignorePermissions = true;\n this.chdirToHome();\n }\n\n zipFromFs(changedAfterMs = -1): Promise<Uint8Array> {\n this.chdirToHome();\n\n const ptr = this.module._zip_from_fs(changedAfterMs);\n if (ptr === 0) {\n return Promise.reject(new Error(\"Can't create zip, see more info in logs\"));\n }\n\n const length = this.module.HEAPU32[ptr / 4];\n const memory: Uint8Array = this.module.HEAPU8;\n const archive = memory.slice(ptr + 4, ptr + 4 + length);\n this.module._free(ptr);\n return Promise.resolve(archive);\n }\n\n zipToFs(zipArchive: Uint8Array, path = \"/\", filter?: string): Promise<void> {\n const Module = this.module;\n\n path = this.normalizeFilename(path);\n const pathParts = this.normalizeFilename(path).split(\"/\");\n this.createPath(pathParts, 0, pathParts.length);\n this.chdir(path);\n\n const withFilter = filter !== undefined && filter.length > 0;\n let filterBuffer = 0;\n if (withFilter) {\n const filterLength = Module[\"lengthBytesUTF8\"](filter) + 1;\n filterBuffer = Module[\"_malloc\"](filterLength);\n Module.stringToUTF8(filter, filterBuffer, filterLength);\n }\n\n const bytes = new Uint8Array(zipArchive);\n const buffer = Module._malloc(bytes.length);\n Module.HEAPU8.set(bytes, buffer);\n const retcode = Module._zip_to_fs(buffer, bytes.length, filterBuffer);\n Module._free(buffer);\n\n this.chdirToHome();\n\n if (withFilter) {\n Module._free(filterBuffer);\n }\n\n if (retcode === 0) {\n return Promise.resolve();\n } else {\n return Promise.reject(new Error(\"Can't extract zip, retcode \" +\n retcode + \", see more info in logs\"));\n }\n }\n\n // ### writeFile\n writeFile(file: string, body: ArrayBuffer | Uint8Array | string) {\n // Allow to create file in FS, it will be created relatively cwd\n // All directories will be created\n //\n // windows style path are also valid, but **drive letter is ignored**\n // if you pass only filename, then file will be writed in cwd\n //\n // body can be string or ArrayBuffer or Uint8Array\n file = this.normalizeFilename(file);\n\n if (body instanceof ArrayBuffer) {\n body = new Uint8Array(body);\n }\n\n const parts = file.split(\"/\");\n\n if (parts.length === 0) {\n throw new Error(\"Can't create file '\" + file + \"', because it's not valid file path\");\n }\n\n const filename = parts[parts.length - 1].trim();\n\n if (filename.length === 0) {\n throw new Error(\"Can't create file '\" + file + \"', because file name is empty\");\n }\n\n /* i < parts.length - 1, because last part is file name */\n const path = this.createPath(parts, 0, parts.length - 1);\n this.module.FS.writeFile(path + \"/\" + filename, body);\n }\n\n async readFile(file: string, encoding: \"binary\" | \"utf8\" = \"utf8\"): Promise<string | Uint8Array> {\n file = this.normalizeFilename(file);\n return this.module.FS.readFile(file, { encoding });\n }\n\n exists(file: string): boolean {\n file = this.normalizeFilename(file);\n try {\n this.module.FS.lookupPath(file);\n return true;\n } catch (e) {\n return false;\n }\n }\n\n destroy(): any {\n try {\n this.module._libzip_destroy();\n } catch (e) {\n return e;\n }\n }\n\n private normalizeFilename(file: string): string {\n file = file.replace(new RegExp(\"^[a-zA-z]+:\"), \"\").replace(new RegExp(\"\\\\\\\\\", \"g\"), \"/\");\n while (file[0] === \"/\") {\n file = file.substr(1);\n }\n return file;\n }\n\n private createPath(parts: string[], begin: number, end: number) {\n let path = \".\";\n for (let i = begin; i < end; ++i) {\n const part = parts[i].trim();\n if (part.length === 0) {\n continue;\n }\n\n this.module.FS.createPath(path, part, true, true);\n path = path + \"/\" + part;\n }\n\n return path;\n }\n\n private chdirToHome() {\n this.module.FS.chdir(this.home);\n }\n\n private chdir(path: string) {\n this.module.FS.chdir(this.home + \"/\" + path);\n }\n\n public async zipAddFile(archive: string, file: string) {\n const Module = this.module;\n const archiveLength = Module[\"lengthBytesUTF8\"](archive) + 1;\n const archiveBuffer = Module[\"_malloc\"](archiveLength);\n Module.stringToUTF8(archive, archiveBuffer, archiveLength);\n\n const fileLength = Module[\"lengthBytesUTF8\"](file) + 1;\n const fileBuffer = Module[\"_malloc\"](fileLength);\n Module.stringToUTF8(file, fileBuffer, fileLength);\n\n const ret = this.module._zipfile_add(archiveBuffer, fileBuffer, fileBuffer);\n\n Module[\"_free\"](archiveBuffer);\n Module[\"_free\"](fileBuffer);\n\n if (ret !== 0) {\n throw new Error(\"Unable to add \" + file + \" into \" + archive);\n }\n }\n}\n","import { ServerMessage, MessageHandler } from \"./protocol\";\n\ninterface DelayedMessage {\n name: ServerMessage,\n props: {[key: string]: any},\n}\n\nexport class MessagesQueue {\n private messages: DelayedMessage[] = [];\n public handler(name: ServerMessage, props: {[key: string]: any}) {\n this.messages.push({ name, props });\n }\n public sendTo(handler: MessageHandler) {\n for (const next of this.messages) {\n handler(next.name, next.props);\n }\n\n this.messages = [];\n }\n}\n","import { CommandInterface, NetworkType, BackendOptions, DosConfig, InitFsEntry, InitFileEntry } from \"../emulators\";\nimport { CommandInterfaceEventsImpl } from \"../impl/ci-impl\";\n\nconst maxDataChunkSize = 4 * 1024 * 1024;\n\nexport type ClientMessage =\n \"wc-install\" |\n \"wc-run\" |\n \"wc-pack-fs-to-bundle\" |\n \"wc-add-key\" |\n \"wc-mouse-move\" |\n \"wc-mouse-button\" |\n \"wc-mouse-sync\" |\n \"wc-exit\" |\n \"wc-sync-sleep\" |\n \"wc-pause\" |\n \"wc-resume\" |\n \"wc-mute\" |\n \"wc-unmute\" |\n \"wc-connect\" |\n \"wc-disconnect\" |\n \"wc-backend-event\" |\n \"wc-asyncify-stats\" |\n \"wc-fs-tree\" |\n \"wc-fs-get-file\" |\n \"wc-send-data-chunk\";\n\nexport type ServerMessage =\n \"ws-extract-progress\" |\n \"ws-ready\" |\n \"ws-server-ready\" |\n \"ws-frame-set-size\" |\n \"ws-update-lines\" |\n \"ws-log\" |\n \"ws-warn\" |\n \"ws-err\" |\n \"ws-stdout\" |\n \"ws-exit\" |\n \"ws-persist\" |\n \"ws-sound-init\" |\n \"ws-sound-push\" |\n \"ws-config\" |\n \"ws-sync-sleep\" |\n \"ws-connected\" |\n \"ws-disconnected\" |\n \"ws-asyncify-stats\" |\n \"ws-fs-tree\" |\n \"ws-send-data-chunk\";\n\nexport type MessageHandler = (name: ServerMessage, props: { [key: string]: any }) => void;\n\nexport interface TransportLayer {\n sessionId: string;\n sendMessageToServer(name: ClientMessage,\n props: { [key: string]: any },\n transfer?: ArrayBuffer[]): void;\n initMessageHandler(handler: MessageHandler): void;\n exit?: () => void;\n}\n\nexport interface FrameLine {\n start: number;\n heapu8: Uint8Array;\n}\n\nexport interface DataChunk {\n type: \"ok\" | \"file\" | \"bundle\";\n name: string;\n data: ArrayBuffer | null;\n}\n\nexport interface AsyncifyStats {\n messageSent: number,\n messageReceived: number,\n messageFrame: number,\n messageSound: number,\n nonSkippableSleepCount: number,\n sleepCount: number,\n sleepTime: number,\n cycles: number,\n netSent: number,\n netRecv: number,\n driveSent: number,\n driveRecv: number,\n driveRecvTime: number,\n driveCacheHit: number,\n driveCacheMiss: number,\n driveCacheUsed: number,\n}\n\nexport interface FsNode {\n name: string,\n size: number | null,\n nodes: FsNode[] | null,\n}\n\nexport class CommandInterfaceOverTransportLayer implements CommandInterface {\n private startedAt = Date.now();\n private frameWidth = 0;\n private frameHeight = 0;\n private rgb: Uint8Array | null = null;\n private rgba: Uint8Array | null = null;\n private freq = 0;\n private utf8Decoder = new TextDecoder();\n\n private init?: InitFsEntry[];\n private transport: TransportLayer;\n private ready: (err: Error | null) => void;\n\n private persistPromise?: Promise<Uint8Array | null>;\n private persistResolve?: (bundle: Uint8Array | null) => void;\n\n private exitPromise?: Promise<void>;\n private exitResolve?: () => void;\n\n private eventsImpl = new CommandInterfaceEventsImpl();\n\n private keyMatrix: { [keyCode: number]: boolean } = {};\n\n private configPromise: Promise<DosConfig>;\n private configResolve: (config: DosConfig) => void = () => {/**/};\n private panicMessages: string[] = [];\n\n private connectPromise: Promise<void> | null = null;\n private connectResolve: () => void = () => {/**/};\n private connectReject: () => void = () => {/**/};\n\n private disconnectPromise: Promise<void> | null = null;\n private disconnectResolve: () => void = () => {/**/};\n\n private asyncifyStatsPromise: Promise<AsyncifyStats> | null = null;\n private asyncifyStatsResolve: (stats: AsyncifyStats) => void = () => {/**/};\n\n private fsTreePromise: Promise<FsNode> | null = null;\n private fsTreeResolve: (fsRoot: FsNode) => void = () => {/**/};\n\n private fsGetFilePromise: { [name: string]: Promise<Uint8Array> } = {};\n private fsGetFileResolve: { [name: string]: (file: Uint8Array) => void } = {};\n private fsGetFileParts: { [name: string]: Uint8Array[] } = {};\n\n private dataChunkPromise: { [name: string]: Promise<void> } = {};\n private dataChunkResolve: { [name: string]: () => void } = {};\n\n public options: BackendOptions;\n\n constructor(init: InitFsEntry[],\n transport: TransportLayer,\n ready: (err: Error | null) => void,\n options: BackendOptions) {\n this.options = options;\n this.init = init;\n this.transport = transport;\n this.ready = ready;\n this.configPromise = new Promise<DosConfig>((resolve) => this.configResolve = resolve);\n this.transport.initMessageHandler(this.onServerMessage.bind(this));\n }\n\n private sendClientMessage(name: ClientMessage, props?: { [key: string]: any }, transfer?: [ArrayBuffer]) {\n props = props || {};\n props.sessionId = props.sessionId || this.transport.sessionId;\n this.transport.sendMessageToServer(name, props, transfer);\n }\n\n private onServerMessage(name: ServerMessage, props: { [key: string]: any }) {\n if (name === undefined || name.length < 3 ||\n name[0] !== \"w\" || name[1] !== \"s\" || name[2] !== \"-\") {\n return;\n }\n\n if (props === undefined || props.sessionId !== this.transport.sessionId) {\n return;\n }\n\n switch (name) {\n case \"ws-ready\": {\n const sendBundles = async () => {\n if (!this.init || this.init.length === 0) {\n return;\n }\n\n const encoder = new TextEncoder();\n const sendData = async (type: \"file\" | \"bundle\", name: string, contents: Uint8Array) => {\n await this.sendDataChunk({\n type,\n name,\n data: contents.buffer,\n });\n\n await this.sendDataChunk({\n type,\n name,\n data: null,\n });\n };\n\n let bundleIndex = 0;\n for (const next of this.init) {\n if (ArrayBuffer.isView(next)) {\n await sendData(\"bundle\", bundleIndex + \"\", next);\n bundleIndex++;\n } else if (typeof next === \"string\") {\n await sendData(\"file\", \".jsdos/dosbox.conf\", encoder.encode(next));\n } else {\n const fileEntry = next as InitFileEntry;\n const dosConfig = next as DosConfig;\n\n if (dosConfig.jsdosConf.version !== undefined) {\n await sendData(\"file\", \".jsdos/dosbox.conf\",\n encoder.encode(dosConfig.dosboxConf));\n await sendData(\"file\", \".jsdos/jsdos.json\",\n encoder.encode(JSON.stringify(dosConfig.jsdosConf, null, 2)));\n } else if (fileEntry.path !== undefined) {\n await sendData(\"file\", fileEntry.path, fileEntry.contents);\n }\n }\n }\n };\n\n sendBundles()\n .then(() => {\n this.sendClientMessage(\"wc-run\", { token: this.options.token });\n })\n .catch((e) => {\n this.onErr(\"panic\", \"Can't send bundles to backend: \" + e.message);\n console.error(e);\n })\n .finally(() => {\n delete this.init;\n });\n } break;\n case \"ws-server-ready\": {\n if (this.panicMessages.length > 0) {\n if (this.transport.exit !== undefined) {\n this.transport.exit();\n }\n this.ready(new Error(JSON.stringify(this.panicMessages)));\n } else {\n this.ready(null);\n }\n delete (this as any).ready;\n } break;\n case \"ws-frame-set-size\": {\n this.onFrameSize(props.width, props.height);\n } break;\n case \"ws-update-lines\": {\n this.onFrameLines(props.lines, props.rgba);\n } break;\n case \"ws-exit\": {\n this.onExit();\n } break;\n case \"ws-log\": {\n // eslint-disable-next-line\n this.onLog(props.tag, props.message);\n } break;\n case \"ws-warn\": {\n // eslint-disable-next-line\n this.onWarn(props.tag, props.message);\n } break;\n case \"ws-err\": {\n // eslint-disable-next-line\n this.onErr(props.tag, props.message);\n } break;\n case \"ws-stdout\": {\n this.onStdout(props.message);\n } break;\n case \"ws-persist\": {\n this.onPersist(props.bundle);\n } break;\n case \"ws-sound-init\": {\n this.onSoundInit(props.freq);\n } break;\n case \"ws-sound-push\": {\n this.onSoundPush(props.samples);\n } break;\n case \"ws-config\": {\n this.onConfig({\n dosboxConf: this.utf8Decoder.decode(props.dosboxConf),\n jsdosConf: JSON.parse(props.jsdosConf),\n });\n } break;\n case \"ws-sync-sleep\": {\n this.sendClientMessage(\"wc-sync-sleep\", props);\n } break;\n case \"ws-connected\": {\n this.connectResolve();\n this.connectPromise = null;\n this.connectResolve = () => {/**/};\n this.connectReject = () => {/**/};\n this.eventsImpl.fireNetworkConnected(props.networkType, props.address);\n } break;\n case \"ws-disconnected\": {\n if (this.connectPromise !== null) {\n this.connectReject();\n this.connectPromise = null;\n this.connectResolve = () => {/**/};\n this.connectReject = () => {/**/};\n } else {\n this.disconnectResolve();\n this.disconnectPromise = null;\n this.disconnectResolve = () => {/**/};\n }\n this.eventsImpl.fireNetworkDisconnected(props.networkType);\n } break;\n case \"ws-extract-progress\": {\n if (this.options.onExtractProgress) {\n this.options.onExtractProgress(props.index, props.file, props.extracted, props.count);\n }\n } break;\n case \"ws-asyncify-stats\": {\n this.asyncifyStatsResolve(props as AsyncifyStats);\n this.asyncifyStatsResolve = () => {/**/};\n this.asyncifyStatsPromise = null;\n } break;\n case \"ws-fs-tree\": {\n this.fsTreeResolve(props.fsTree as FsNode);\n this.fsTreeResolve = () => {/**/};\n this.fsTreePromise = null;\n } break;\n case \"ws-send-data-chunk\": {\n const chunk: DataChunk = props.chunk;\n const key = this.dataChunkKey(chunk);\n if (chunk.type === \"ok\") {\n if (this.dataChunkPromise[key] !== undefined) {\n this.dataChunkResolve[key]();\n delete this.dataChunkPromise[key];\n delete this.dataChunkResolve[key];\n }\n } else if (chunk.type === \"file\") {\n if (chunk.data === null) {\n const file = this.mergeChunks(this.fsGetFileParts[chunk.name]);\n this.fsGetFileResolve[chunk.name](file);\n delete this.fsGetFilePromise[chunk.name];\n delete this.fsGetFileResolve[chunk.name];\n } else {\n this.fsGetFileParts[chunk.name].push(new Uint8Array(chunk.data));\n }\n } else {\n console.log(\"Unknown chunk type:\", chunk.type);\n }\n } break;\n default: {\n // eslint-disable-next-line\n console.log(\"Unknown server message (ws):\", name);\n } break;\n }\n }\n\n private onConfig(config: DosConfig) {\n this.configResolve(config);\n }\n\n private onFrameSize(width: number, height: number) {\n if (this.frameWidth === width && this.frameHeight === height) {\n return;\n }\n\n this.frameWidth = width;\n this.frameHeight = height;\n this.rgb = new Uint8Array(width * height * 3);\n this.eventsImpl.fireFrameSize(width, height);\n }\n\n private onFrameLines(lines: FrameLine[], rgbaPtr: number) {\n for (const line of (lines as FrameLine[])) {\n this.rgb!.set(line.heapu8, line.start * this.frameWidth * 3);\n }\n\n this.eventsImpl.fireFrame(this.rgb, this.rgba);\n }\n\n private onSoundInit(freq: number) {\n this.freq = freq;\n }\n\n private onSoundPush(samples: Float32Array) {\n this.eventsImpl.fireSoundPush(samples);\n }\n\n private onLog(tag: string, message: string) {\n this.eventsImpl.fireMessage(\"log\", \"[\" + tag + \"]\" + message);\n }\n\n private onWarn(tag: string, message: string) {\n this.eventsImpl.fireMessage(\"warn\", \"[\" + tag + \"]\" + message);\n }\n\n private onErr(tag: string, message: string) {\n if (tag === \"panic\") {\n this.panicMessages.push(message);\n console.error(\"[\" + tag + \"]\" + message);\n }\n this.eventsImpl.fireMessage(\"error\", \"[\" + tag + \"]\" + message);\n }\n\n private onStdout(message: string) {\n this.eventsImpl.fireStdout(message);\n }\n\n public config() {\n return this.configPromise;\n }\n\n public width() {\n return this.frameWidth;\n }\n\n public height() {\n return this.frameHeight;\n }\n\n public soundFrequency() {\n return this.freq;\n }\n\n public screenshot(): Promise<ImageData> {\n if (this.rgb !== null || this.rgba !== null) {\n const rgba = new Uint8ClampedArray(this.frameWidth * this.frameHeight * 4);\n const frame = (this.rgb !== null ? this.rgb : this.rgba) as Uint8Array;\n\n let frameOffset = 0;\n let rgbaOffset = 0;\n\n while (rgbaOffset < rgba.length) {\n rgba[rgbaOffset++] = frame[frameOffset++];\n rgba[rgbaOffset++] = frame[frameOffset++];\n rgba[rgbaOffset++] = frame[frameOffset++];\n rgba[rgbaOffset++] = 255;\n\n if (frame.length === rgba.length) {\n frameOffset++;\n }\n }\n\n return Promise.resolve(new ImageData(rgba, this.frameWidth, this.frameHeight));\n } else {\n return Promise.reject(new Error(\"No frame received\"));\n }\n }\n\n public simulateKeyPress(...keyCodes: number[]) {\n const timeMs = Date.now() - this.startedAt;\n keyCodes.forEach((keyCode) => this.addKey(keyCode, true, timeMs));\n keyCodes.forEach((keyCode) => this.addKey(keyCode, false, timeMs + 16));\n }\n\n public sendKeyEvent(keyCode: number, pressed: boolean) {\n this.addKey(keyCode, pressed, Date.now() - this.startedAt);\n }\n\n // public for test\n public addKey(keyCode: number, pressed: boolean, timeMs: number) {\n const keyPressed = this.keyMatrix[keyCode] === true;\n if (keyPressed === pressed) {\n return;\n }\n this.keyMatrix[keyCode] = pressed;\n this.sendClientMessage(\"wc-add-key\", { key: keyCode, pressed, timeMs });\n }\n\n public sendMouseMotion(x: number, y: number) {\n this.sendClientMessage(\"wc-mouse-move\", { x, y, relative: false, timeMs: Date.now() - this.startedAt });\n }\n\n public sendMouseRelativeMotion(x: number, y: number) {\n this.sendClientMessage(\"wc-mouse-move\", { x, y, relative: true, timeMs: Date.now() - this.startedAt });\n }\n\n public sendMouseButton(button: number, pressed: boolean) {\n this.sendClientMessage(\"wc-mouse-button\", { button, pressed, timeMs: Date.now() - this.startedAt });\n }\n\n public sendMouseSync() {\n this.sendClientMessage(\"wc-mouse-sync\", { timeMs: Date.now() - this.startedAt });\n }\n\n public sendBackendEvent(payload: any) {\n this.sendClientMessage(\"wc-backend-event\", { json: JSON.stringify(payload) });\n }\n\n\n public persist(onlyChanges?: boolean): Promise<Uint8Array | null> {\n if (this.persistPromise !== undefined) {\n return this.persistPromise;\n }\n\n\n const persistPromise = new Promise<Uint8Array | null>((resolve) => {\n this.persistResolve = resolve;\n });\n this.persistPromise = persistPromise;\n this.sendClientMessage(\"wc-pack-fs-to-bundle\", {\n onlyChanges: onlyChanges !== false,\n });\n\n return persistPromise;\n }\n\n private onPersist(bundle: Uint8Array) {\n if (this.persistResolve) {\n this.persistResolve(bundle);\n delete this.persistPromise;\n delete this.persistResolve;\n }\n }\n\n public pause() {\n this.sendClientMessage(\"wc-pause\");\n }\n\n public resume() {\n this.sendClientMessage(\"wc-resume\");\n }\n\n public mute() {\n this.sendClientMessage(\"wc-mute\");\n }\n\n public unmute() {\n this.sendClientMessage(\"wc-unmute\");\n }\n\n public exit(): Promise<void> {\n if (this.exitPromise !== undefined) {\n return this.exitPromise;\n }\n this.exitPromise = new Promise<void>((resolve) => this.exitResolve = resolve);\n this.exitPromise.then(() => {\n this.events().fireExit();\n });\n\n this.resume();\n this.sendClientMessage(\"wc-exit\");\n\n return this.exitPromise;\n }\n\n private onExit() {\n if (this.transport.exit !== undefined) {\n this.transport.exit();\n }\n if (this.exitResolve) {\n this.exitResolve();\n delete this.exitPromise;\n delete this.exitResolve;\n }\n }\n\n public events() {\n return this.eventsImpl;\n }\n\n public networkConnect(networkType: NetworkType, address: string): Promise<void> {\n if (this.connectPromise !== null || this.disconnectPromise !== null) {\n return Promise.reject(new Error(\"Already prefoming connection or disconnection...\"));\n }\n\n this.connectPromise = new Promise<void>((resolve, reject) => {\n if (!address.startsWith(\"wss://\") && !address.startsWith(\"ws://\")) {\n address = (window.location.protocol === \"http:\" ? \"ws://\" : \"wss://\") + address;\n }\n\n this.connectResolve = resolve;\n this.connectReject = reject;\n this.sendClientMessage(\"wc-connect\", {\n networkType,\n address,\n });\n });\n return this.connectPromise;\n }\n\n public networkDisconnect(networkType: NetworkType): Promise<void> {\n if (this.connectPromise !== null || this.disconnectPromise !== null) {\n return Promise.reject(new Error(\"Already prefoming connection or disconnection...\"));\n }\n\n this.disconnectPromise = new Promise<void>((resolve) => {\n this.disconnectResolve = resolve;\n\n this.sendClientMessage(\"wc-disconnect\", {\n networkType,\n });\n });\n return this.disconnectPromise;\n }\n\n public asyncifyStats(): Promise<AsyncifyStats> {\n if (this.asyncifyStatsPromise !== null) {\n return this.asyncifyStatsPromise;\n }\n\n const promise = new Promise<AsyncifyStats>((resolve) => {\n this.asyncifyStatsResolve = resolve;\n });\n\n this.asyncifyStatsPromise = promise;\n this.sendClientMessage(\"wc-asyncify-stats\", {});\n\n return promise;\n }\n\n public fsTree(): Promise<FsNode> {\n if (this.fsTreePromise !== null) {\n return this.fsTreePromise;\n }\n\n const promise = new Promise<FsNode>((resolve) => {\n this.fsTreeResolve = resolve;\n });\n this.fsTreePromise = promise;\n this.sendClientMessage(\"wc-fs-tree\");\n\n return promise;\n }\n\n async fsReadFile(file: string): Promise<Uint8Array> {\n if (this.fsGetFilePromise[file] !== undefined) {\n throw new Error(\"fsGetFile should not be called twice for same file\");\n }\n\n const promise = new Promise<Uint8Array>((resolve) => {\n this.fsGetFileResolve[file] = resolve;\n });\n this.fsGetFilePromise[file] = promise;\n this.fsGetFileParts[file] = [];\n this.sendClientMessage(\"wc-fs-get-file\", {\n file,\n });\n\n return promise;\n }\n\n async fsWriteFile(file: string, contents: ReadableStream<Uint8Array> | Uint8Array): Promise<void> {\n if (ArrayBuffer.isView(contents)) {\n await this.sendDataChunk({\n type: \"file\",\n name: file,\n data: contents.buffer,\n });\n } else {\n const reader = contents.getReader();\n while (true) {\n const result = await reader.read();\n if (result.value !== undefined) {\n await this.sendDataChunk({\n type: \"file\",\n name: file,\n data: result.value.buffer,\n });\n }\n if (result.done) {\n break;\n }\n }\n }\n\n await this.sendDataChunk({\n type: \"file\",\n name: file,\n data: null,\n });\n }\n\n async fsDeleteFile(file: string): Promise<void> {\n throw new Error(\"not implemented\");\n }\n\n private async sendDataChunk(chunk: DataChunk): Promise<void> {\n if (chunk.data === null || chunk.data.byteLength <= maxDataChunkSize) {\n return this.sendFullDataChunk(chunk);\n } else {\n let pos = 0;\n while (pos < chunk.data.byteLength) {\n await this.sendFullDataChunk({\n type: chunk.type,\n name: chunk.name,\n data: chunk.data.slice(pos, Math.min(chunk.data.byteLength, pos + maxDataChunkSize)),\n });\n pos += maxDataChunkSize;\n }\n }\n }\n\n private async sendFullDataChunk(chunk: DataChunk): Promise<void> {\n const key = this.dataChunkKey(chunk);\n if (this.dataChunkPromise[key] !== undefined) {\n throw new Error(\"sendDataChunk should be accepted before sending new one\");\n }\n const promise = new Promise<void>((resolve) => {\n this.dataChunkResolve[key] = resolve;\n });\n this.dataChunkPromise[key] = promise;\n this.sendClientMessage(\"wc-send-data-chunk\", {\n chunk,\n }, chunk.data === null ? undefined : [chunk.data]);\n return promise;\n }\n\n private dataChunkKey(chunk: DataChunk) {\n return chunk.name;\n }\n\n private mergeChunks(parts: Uint8Array[]): Uint8Array {\n if (parts.length === 1) {\n return parts[0];\n }\n\n let length = 0;\n for (const next of parts) {\n length += next.byteLength;\n }\n const merged = new Uint8Array(length);\n length = 0;\n for (const next of parts) {\n merged.set(next, length);\n length += next.byteLength;\n }\n return merged;\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ export declare const Build: {
2
+ version: string;
3
+ buildSeed: number;
4
+ "wdosbox-x.wasm": {
5
+ size: number;
6
+ gzSize: number;
7
+ };
8
+ "wdosbox-x.js": {
9
+ size: number;
10
+ gzSize: number;
11
+ };
12
+ "wdosbox.wasm": {
13
+ size: number;
14
+ gzSize: number;
15
+ };
16
+ "wdosbox.js": {
17
+ size: number;
18
+ gzSize: number;
19
+ };
20
+ "wlibzip.wasm": {
21
+ size: number;
22
+ gzSize: number;
23
+ };
24
+ "wlibzip.js": {
25
+ size: number;
26
+ gzSize: number;
27
+ };
28
+ };
@@ -0,0 +1,20 @@
1
+ import { WasmModule } from "../../impl/modules";
2
+ export interface DosArchiveSource {
3
+ url: string;
4
+ path: string;
5
+ type?: "zip";
6
+ }
7
+ export default class DosBundle {
8
+ dosboxConf: string;
9
+ jsdosConf: {
10
+ version: string;
11
+ };
12
+ sources: DosArchiveSource[];
13
+ private libzipWasm;
14
+ constructor(libzipWasm: WasmModule);
15
+ autoexec(...lines: string[]): DosBundle;
16
+ extract(url: string, path?: string, type?: "zip"): DosBundle;
17
+ extractAll(sources: DosArchiveSource[]): DosBundle;
18
+ toUint8Array(overwriteConfig?: boolean): Promise<Uint8Array>;
19
+ }
20
+ export declare const defaultConfig: string;
@@ -0,0 +1,3 @@
1
+ import { WasmModule } from "../../../impl/modules";
2
+ import { TransportLayer } from "../../../protocol/protocol";
3
+ export declare function dosDirect(wasmModule: WasmModule, sessionId: string): Promise<TransportLayer>;
@@ -0,0 +1,3 @@
1
+ import { WasmModule } from "../../../impl/modules";
2
+ import { TransportLayer } from "../../../protocol/protocol";
3
+ export declare function dosWorker(workerUrl: string, wasmModule: WasmModule, sessionId: string): Promise<TransportLayer>;
@@ -0,0 +1,76 @@
1
+ import DosBundle from "./dos/bundle/dos-bundle";
2
+ import { AsyncifyStats, TransportLayer, FsNode } from "./protocol/protocol";
3
+ export interface DosConfig {
4
+ dosboxConf: string;
5
+ jsdosConf: {
6
+ version: string;
7
+ };
8
+ }
9
+ export declare enum NetworkType {
10
+ NETWORK_DOSBOX_IPX = 0
11
+ }
12
+ export interface BackendOptions {
13
+ token?: string | undefined;
14
+ onExtractProgress?: (bundleIndex: number, file: string, extracted: number, total: number) => void;
15
+ }
16
+ export type InitBundleEntry = Uint8Array;
17
+ export interface InitFileEntry {
18
+ path: string;
19
+ contents: Uint8Array;
20
+ }
21
+ export type InitFsEntry = InitBundleEntry | InitFileEntry | DosConfig | string;
22
+ export type InitFs = InitFsEntry | InitFsEntry[];
23
+ export interface Emulators {
24
+ pathPrefix: string;
25
+ version: string;
26
+ wdosboxJs: string;
27
+ bundle: () => Promise<DosBundle>;
28
+ bundleConfig: (bundle: InitBundleEntry) => Promise<DosConfig | null>;
29
+ bundleUpdateConfig: (bundle: InitBundleEntry, config: DosConfig) => Promise<Uint8Array>;
30
+ dosboxNode: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
31
+ dosboxDirect: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
32
+ dosboxWorker: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
33
+ dosboxXNode: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
34
+ dosboxXDirect: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
35
+ dosboxXWorker: (init: InitFs, options?: BackendOptions) => Promise<CommandInterface>;
36
+ backend: (init: InitFs, transportLayer: TransportLayer, options?: BackendOptions) => Promise<CommandInterface>;
37
+ }
38
+ export interface CommandInterface {
39
+ config: () => Promise<DosConfig>;
40
+ height: () => number;
41
+ width: () => number;
42
+ soundFrequency: () => number;
43
+ screenshot: () => Promise<ImageData>;
44
+ pause: () => void;
45
+ resume: () => void;
46
+ mute: () => void;
47
+ unmute: () => void;
48
+ exit: () => Promise<void>;
49
+ simulateKeyPress: (...keyCodes: number[]) => void;
50
+ sendKeyEvent: (keyCode: number, pressed: boolean) => void;
51
+ sendMouseMotion: (x: number, y: number) => void;
52
+ sendMouseRelativeMotion: (x: number, y: number) => void;
53
+ sendMouseButton: (button: number, pressed: boolean) => void;
54
+ sendMouseSync: () => void;
55
+ sendBackendEvent: (event: any) => void;
56
+ persist(onlyChanges?: boolean): Promise<Uint8Array | null>;
57
+ events(): CommandInterfaceEvents;
58
+ networkConnect(networkType: NetworkType, address: string): Promise<void>;
59
+ networkDisconnect(networkType: NetworkType): Promise<void>;
60
+ asyncifyStats(): Promise<AsyncifyStats>;
61
+ fsTree(): Promise<FsNode>;
62
+ fsReadFile(file: string): Promise<Uint8Array>;
63
+ fsWriteFile(file: string, contents: ReadableStream<Uint8Array> | Uint8Array): Promise<void>;
64
+ fsDeleteFile(file: string): Promise<void>;
65
+ }
66
+ export type MessageType = "log" | "warn" | "error" | string;
67
+ export interface CommandInterfaceEvents {
68
+ onStdout: (consumer: (message: string) => void) => void;
69
+ onFrameSize: (consumer: (width: number, height: number) => void) => void;
70
+ onFrame: (consumer: (rgb: Uint8Array | null, rgba: Uint8Array | null) => void) => void;
71
+ onSoundPush: (consumer: (samples: Float32Array) => void) => void;
72
+ onExit: (consumer: () => void) => void;
73
+ onMessage: (consumer: (msgType: MessageType, ...args: any[]) => void) => void;
74
+ onNetworkConnected: (consumer: (networkType: NetworkType, address: string) => void) => void;
75
+ onNetworkDisconnected: (consumer: (networkType: NetworkType) => void) => void;
76
+ }
@@ -0,0 +1,9 @@
1
+ export interface XhrOptions {
2
+ method?: string;
3
+ progress?: (total: number, loaded: number) => void;
4
+ data?: string;
5
+ responseType?: XMLHttpRequestResponseType;
6
+ }
7
+ export declare const httpRequest: typeof XhrRequest;
8
+ declare function XhrRequest(url: string, options: XhrOptions): Promise<string | ArrayBuffer>;
9
+ export {};
@@ -0,0 +1,29 @@
1
+ import { CommandInterfaceEvents, MessageType, NetworkType } from "../emulators";
2
+ export declare class CommandInterfaceEventsImpl implements CommandInterfaceEvents {
3
+ private onStdoutConsumers;
4
+ private delayedStdout;
5
+ private onFrameSizeConsumers;
6
+ private onFrameConsumers;
7
+ private onSoundPushConsumers;
8
+ private onExitConsumers;
9
+ private onMessageConsumers;
10
+ private delayedMessages;
11
+ private onNetworkConnectedConsumers;
12
+ private onNetworkDisconnectedConsumers;
13
+ onStdout: (consumer: (message: string) => void) => void;
14
+ onFrameSize: (consumer: (width: number, height: number) => void) => void;
15
+ onFrame: (consumer: (rgb: Uint8Array | null, rgba: Uint8Array | null) => void) => void;
16
+ onSoundPush: (consumer: (samples: Float32Array) => void) => void;
17
+ onExit: (consumer: () => void) => void;
18
+ onMessage: (consumer: (msgType: MessageType, ...args: any[]) => void) => void;
19
+ onNetworkConnected(consumer: (networkType: NetworkType, address: string) => void): void;
20
+ onNetworkDisconnected(consumer: (networkType: NetworkType) => void): void;
21
+ fireStdout: (message: string) => void;
22
+ fireFrameSize: (width: number, height: number) => void;
23
+ fireFrame: (rgb: Uint8Array | null, rgba: Uint8Array | null) => void;
24
+ fireSoundPush: (samples: Float32Array) => void;
25
+ fireExit: () => void;
26
+ fireMessage: (msgType: MessageType, ...args: any[]) => void;
27
+ fireNetworkConnected: (networkType: NetworkType, address: string) => void;
28
+ fireNetworkDisconnected: (networkType: NetworkType) => void;
29
+ }
@@ -0,0 +1,26 @@
1
+ import { Emulators, CommandInterface, BackendOptions, DosConfig, InitFs, InitBundleEntry } from "../emulators";
2
+ import { IWasmModules } from "./modules";
3
+ import DosBundle from "../dos/bundle/dos-bundle";
4
+ import { TransportLayer } from "../protocol/protocol";
5
+ declare class EmulatorsImpl implements Emulators {
6
+ pathPrefix: string;
7
+ version: string;
8
+ wdosboxJs: string;
9
+ wdosboxxJs: string;
10
+ private wasmModulesPromise?;
11
+ bundle(): Promise<DosBundle>;
12
+ bundleConfig(bundle: InitBundleEntry): Promise<DosConfig | null>;
13
+ bundleUpdateConfig(bundle: InitBundleEntry, config: DosConfig): Promise<Uint8Array>;
14
+ dosboxNode(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
15
+ dosboxDirect(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
16
+ dosboxWorker(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
17
+ dosboxXNode(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
18
+ dosboxXDirect(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
19
+ dosboxXWorker(init: InitFs, options?: BackendOptions): Promise<CommandInterface>;
20
+ backend(init: InitFs, transportLayer: TransportLayer, options?: BackendOptions): Promise<CommandInterface>;
21
+ wasmModules(): Promise<IWasmModules>;
22
+ dosDirect(init: InitFs): Promise<CommandInterface>;
23
+ dosWorker(init: InitFs): Promise<CommandInterface>;
24
+ }
25
+ declare const emulators: EmulatorsImpl;
26
+ export default emulators;