From 5ff72459363212380d77695d6f767f2de7cad9f0 Mon Sep 17 00:00:00 2001 From: Michael Green <84688932+michael-j-green@users.noreply.github.com> Date: Wed, 17 Dec 2025 12:16:09 +1100 Subject: [PATCH] Remove legacy download methods --- data/src/emulator.js | 289 ++----------------------------------------- 1 file changed, 9 insertions(+), 280 deletions(-) diff --git a/data/src/emulator.js b/data/src/emulator.js index 342da5f..7b27e8f 100644 --- a/data/src/emulator.js +++ b/data/src/emulator.js @@ -885,6 +885,12 @@ class EmulatorJS { }) } + /** + * Download a file, with caching and File object support + * @param {*} url The URL or File object to download + * @param {*} type The download type (from this.downloadType) + * @returns + */ download(url, type) { if (url === undefined || url === null || url === "") { if (this.debug) console.log("[EJS " + type.name.toUpperCase() + "] No URL provided, skipping download."); @@ -1019,281 +1025,9 @@ class EmulatorJS { resolve(returnData); }); } - - downloadGameFile(assetUrl, type, progressMessage, decompressProgressMessage) { - if (assetUrl === undefined || assetUrl === null) { - return new Promise((resolve) => { - resolve(assetUrl); - }); - } - console.log("[EJS " + type.name.toUpperCase() + "] Requested download for " + assetUrl); - return new Promise(async (resolve, reject) => { - if ((typeof assetUrl !== "string" || !assetUrl.trim()) && !this.toData(assetUrl, true) && !(assetUrl instanceof File)) { - return resolve(assetUrl); - } - const gotData = async (input) => { - const coreFilename = "/" + this.fileName; - const coreFilePath = coreFilename.substring(0, coreFilename.length - coreFilename.split("/").pop().length); - if (this.config.dontExtractBIOS === true) { - this.gameManager.FS.writeFile(coreFilePath + assetUrl.split("/").pop(), new Uint8Array(input)); - return resolve(assetUrl); - } - - // Decompress if needed - if (!this.compression) { - this.compression = new window.EJS_COMPRESSION(this); - } - - const assetFilename = assetUrl.split("/").pop().split("#")[0].split("?")[0]; - this.textElem.innerText = decompressProgressMessage; - - const data = await this.compression.decompress(new Uint8Array(input), (m, appendMsg) => { - this.textElem.innerText = appendMsg ? (decompressProgressMessage + m) : m; - }, null); - - for (const k in data) { - if (k === "!!notCompressedData") { - this.gameManager.FS.writeFile(coreFilePath + assetUrl.split("/").pop().split("#")[0].split("?")[0], data[k]); - break; - } - if (k.endsWith("/")) continue; - this.gameManager.FS.writeFile(coreFilePath + k.split("/").pop(), data[k]); - } - } - - console.log("[EJS " + type.name.toUpperCase() + "] Downloading " + assetUrl); - this.textElem.innerText = progressMessage; - - const res = await this.downloadFile(assetUrl, type.name, (progress) => { - this.textElem.innerText = progressMessage + progress; - }, true, { responseType: "arraybuffer", method: "GET" }, false, type.dontCache); - if (res === -1) { - this.startGameError(this.localization("Network Error")); - reject(); - return; - } - if (assetUrl instanceof File) { - assetUrl = assetUrl.name; - } else if (this.toData(assetUrl, true)) { - assetUrl = "game"; - } - await gotData(res.data); - resolve(assetUrl); - console.log("[EJS " + type.name.toUpperCase() + "] Download and decompression complete"); - }); - } - downloadGamePatch() { - return new Promise(async (resolve) => { - this.config.gamePatchUrl = await this.downloadGameFile(this.config.gamePatchUrl, this.downloadType.patch, this.localization("Download Game Patch"), this.localization("Decompress Game Patch")); - resolve(); - }); - } - downloadGameParent() { - return new Promise(async (resolve) => { - this.config.gameParentUrl = await this.downloadGameFile(this.config.gameParentUrl, this.downloadType.parent, this.localization("Download Game Parent"), this.localization("Decompress Game Parent")); - resolve(); - }); - } - downloadBios() { - return new Promise(async (resolve) => { - this.config.biosUrl = await this.downloadGameFile(this.config.biosUrl, this.downloadType.bios, this.localization("Download Game BIOS"), this.localization("Decompress Game BIOS")); - resolve(); - }); - } - downloadRom() { - const supportsExt = (ext) => { - const core = this.getCore(); - if (!this.extensions) return false; - return this.extensions.includes(ext); - }; - - return new Promise(resolve => { - this.textElem.innerText = this.localization("Download Game Data"); - - // List of cores to generate a CUE file for, if it doesn't exist. - const cueGeneration = ["mednafen_psx_hw"]; - const prioritizeExtensions = ["cue", "ccd", "toc", "m3u"]; - - let createCueFile = cueGeneration.includes(this.getCore()); - if (this.config.disableCue === true) { - createCueFile = false; - } - - const writeFilesToFS = (fileName, fileData, altName) => { - if (fileName.includes("/")) { - const paths = fileName.split("/"); - let cp = ""; - for (let i = 0; i < paths.length - 1; i++) { - if (paths[i] === "") continue; - cp += `/${paths[i]}`; - if (!this.gameManager.FS.analyzePath(cp).exists) { - this.gameManager.FS.mkdir(cp); - } - } - } - if (fileName.endsWith("/")) { - this.gameManager.FS.mkdir(fileName); - return null; - } - if (fileName === "!!notCompressedData") { - this.gameManager.FS.writeFile(altName, fileData); - return altName; - } else { - this.gameManager.FS.writeFile(`/${fileName}`, fileData); - return fileName; - } - }; - - const selectRomFile = (fileNames, coreName, disableCue) => { - let isoFile = null; - let supportedFile = null; - let cueFile = null; - let selectedCueExt = null; - fileNames.forEach(fileName => { - const ext = fileName.split(".").pop().toLowerCase(); - if (supportedFile === null && supportsExt(ext)) { - supportedFile = fileName; - } - if (isoFile === null && ["iso", "cso", "chd", "elf"].includes(ext)) { - isoFile = fileName; - } - if (prioritizeExtensions.includes(ext)) { - const currentCueExt = (cueFile === null) ? null : cueFile.split(".").pop().toLowerCase(); - if (coreName === "psx") { - // Always prefer m3u files for psx cores - if (currentCueExt !== "m3u") { - if (cueFile === null || ext === "m3u") { - cueFile = fileName; - } - } - } else { - const priority = ["cue", "ccd"] - // Prefer cue or ccd files over toc or m3u - if (!priority.includes(currentCueExt)) { - if (cueFile === null || priority.includes(ext)) { - cueFile = fileName; - } - } - } - } - }); - if (supportedFile !== null) { - this.fileName = supportedFile; - } else { - this.fileName = fileNames[0]; - } - if (isoFile !== null && supportsExt(isoFile.split(".").pop().toLowerCase())) { - this.fileName = isoFile; - } - if (cueFile !== null && supportsExt(cueFile.split(".").pop().toLowerCase())) { - this.fileName = cueFile; - } else if (createCueFile && supportsExt("m3u") && supportsExt("cue")) { - this.fileName = this.gameManager.createCueFile(fileNames); - } - if (this.getCore(true) === "dos" && !this.config.disableBatchBootup) { - this.fileName = this.gameManager.writeBootupBatchFile(); - } - resolve(); - }; - - const gotGameData = async (data) => { - const coreName = this.getCore(true); - const altName = this.getBaseFileName(true); - - if (["arcade", "mame"].includes(coreName) || this.config.dontExtractRom === true) { - this.fileName = altName; - this.gameManager.FS.writeFile(this.fileName, new Uint8Array(data)); - resolve(); - return; - } - - let disableCue = false; - if (["pcsx_rearmed", "genesis_plus_gx", "picodrive", "mednafen_pce", "smsplus", "vice_x64", "vice_x64sc", "vice_x128", "vice_xvic", "vice_xpet", "puae"].includes(coreName) && this.config.disableCue === undefined) { - disableCue = true; - console.log("DISABLING CUE!"); - } else { - disableCue = this.config.disableCue; - } - - const romFilename = this.getBaseFileName(true); - const cacheKey = `rom-${coreName}-${romFilename}`; - - // Check the cache for decompressed content - const cached = await this.storageCache.get(cacheKey, false); - - if (cached && cached.files) { - // Cache hit - write cached files to FS - if (this.debug) console.log("[EJS ROM] Using cached decompressed files"); - const fileNames = []; - for (const file of cached.files) { - const writtenName = writeFilesToFS(file.filename, file.bytes, altName); - if (writtenName) { - fileNames.push(writtenName); - } - } - selectRomFile(fileNames, coreName, disableCue); - return; - } - - // Cache miss - decompress and cache the result - let fileNames = []; - - if (!this.compression) { - this.compression = new window.EJS_COMPRESSION(this); - } - - this.compression.decompress(new Uint8Array(data), (m, appendMsg) => { - this.textElem.innerText = appendMsg ? (this.localization("Decompress Game Data") + m) : m; - }, (fileName, fileData) => { - const writtenName = writeFilesToFS(fileName, fileData, altName); - if (writtenName) { - fileNames.push(writtenName); - } - }).then(async (decompressedFiles) => { - // Store decompressed files in cache - const cacheFiles = fileNames.map(name => { - const data = this.gameManager.FS.readFile(`/${name}`); - return new window.EJS_FileItem(name, data); - }); - const cacheItem = new window.EJS_CacheItem( - cacheKey, - cacheFiles, - Date.now(), - this.downloadType.rom.name, - "arraybuffer", - romFilename, - romFilename, - Date.now() + 5 * 24 * 60 * 60 * 1000 - ); - await this.storageCache.put(cacheItem); - - selectRomFile(fileNames, coreName, disableCue); - return; - }); - } - const downloadFile = async () => { - console.log("[EJS ROM] Downloading ROM " + this.config.gameUrl.name); - // create new download class - const res = await this.downloadFile(this.config.gameUrl, this.downloadType.rom.name, (progress) => { - this.textElem.innerText = this.localization("Download Game Data") + progress; - }, true, { responseType: "arraybuffer", method: "GET" }, false, this.downloadType.rom.dontCache); - if (res === -1) { - this.startGameError(this.localization("Network Error")); - return; - } - if (this.config.gameUrl instanceof File) { - this.config.gameUrl = this.config.gameUrl.name; - } else if (this.toData(this.config.gameUrl, true)) { - this.config.gameUrl = "game"; - } - gotGameData(res.data); - if (this.debug) console.log("[EJS ROM] Download and decompression complete"); - } - - // download the content - downloadFile(); - }) - } + /** + * Download all necessary files and start the game + */ downloadFiles() { (async () => { this.gameManager = new window.EJS_GameManager(this.Module, this); @@ -1308,11 +1042,6 @@ class EmulatorJS { await this.downloadStartState(); const parentData = await this.download(this.config.gameParentUrl, this.downloadType.parent); const patchData = await this.download(this.config.gamePatchUrl, this.downloadType.patch); - // await this.downloadRom(); - // await this.downloadBios(); - // await this.downloadStartState(); - // await this.downloadGameParent(); - // await this.downloadGamePatch(); // Select rom file for start up // List of cores to generate a CUE file for, if it doesn't exist.