From 819c7b23caeaa564cce2678e333da582b4964c71 Mon Sep 17 00:00:00 2001 From: Arianrhod Sandlot Date: Wed, 22 Jan 2025 17:38:55 +0800 Subject: [PATCH] test: combine the demo page and the e2e test page into a single playground page --- demo/demo.css | 4 - demo/demo.ts | 144 ---------------- demo/index.html | 33 ---- package.json | 2 +- playground/activate.ts | 149 ++++++++++++++++ .../e2e/test-page => playground}/index.html | 41 ++++- tests/e2e/instance-ra-esm.spec.ts | 4 +- tests/e2e/instance-ra-legacy.spec.ts | 4 +- tests/e2e/playwright.config.ts | 4 +- tests/e2e/static-ra-esm.spec.ts | 4 +- tests/e2e/static-ra-legacy.spec.ts | 4 +- tests/e2e/test-page/test-page.css | 4 - tests/e2e/test-page/test-page.js | 161 ------------------ 13 files changed, 194 insertions(+), 364 deletions(-) delete mode 100644 demo/demo.css delete mode 100644 demo/demo.ts delete mode 100644 demo/index.html create mode 100644 playground/activate.ts rename {tests/e2e/test-page => playground}/index.html (52%) delete mode 100644 tests/e2e/test-page/test-page.css delete mode 100644 tests/e2e/test-page/test-page.js diff --git a/demo/demo.css b/demo/demo.css deleted file mode 100644 index 830576d..0000000 --- a/demo/demo.css +++ /dev/null @@ -1,4 +0,0 @@ -* { - margin: 0; - padding: 0; -} diff --git a/demo/demo.ts b/demo/demo.ts deleted file mode 100644 index 337f917..0000000 --- a/demo/demo.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Nostalgist } from '../src' - -let nostalgist: Nostalgist -let state: Awaited> - -async function nes() { - nostalgist = await Nostalgist.nes({ rom: 'flappybird.nes' }) -} - -async function megadrive() { - nostalgist = await Nostalgist.megadrive('asciiwar.bin') -} - -async function gbc() { - nostalgist = await Nostalgist.gbc('combatsoccer.gbc') -} - -async function launchNestopia() { - nostalgist = await Nostalgist.launch({ - core: 'nestopia', - rom: 'pong1k.nes', - }) -} - -async function launchFceummWithCoreConfig() { - nostalgist = await Nostalgist.launch({ - core: 'fceumm', - retroarchCoreConfig: { - fceumm_turbo_enable: 'Both', - }, - rom: 'flappybird.nes', - shader: 'crt/crt-easymode', - }) -} - -async function launchFceummWithRaLegacy() { - nostalgist = await Nostalgist.launch({ - core: 'fceumm', - resolveCoreJs(core) { - return `https://cdn.jsdelivr.net/gh/arianrhodsandlot/retroarch-emscripten-build@v1.16.0/retroarch/${core}_libretro.js` - }, - resolveCoreWasm(core) { - return `https://cdn.jsdelivr.net/gh/arianrhodsandlot/retroarch-emscripten-build@v1.16.0/retroarch/${core}_libretro.wasm` - }, - rom: 'flappybird.nes', - }) -} - -async function launchCustomRom() { - nostalgist = await Nostalgist.launch({ - core: 'fceumm', - rom: await showOpenFilePicker().then(([fileHandle]) => fileHandle.getFile()), - }) -} - -async function launchState() { - const stateDataUrl = - 'data:application/octet-stream;base64,I1JaSVB2ASMAAAIAuDUAAAAAAABBBAAAeJztmt9rHEUcwL+7cxe3PZqNtUnR1usd1DaxFfYuOSw2kuztj9wl92Ozu3fXi7VULPEn5MUfsc1DJEEsTUKgYJGIlEBfqmgrItXH/gUB9clnqW8W8uKDMn5ndjc9o01LYwzF+ZC5+cyPnf3uzh07s8TVPV/3LalslVOf5gBsw6MLmNcOAUcqKACOASBjYd+MzqowOSdCgWYkXih/OKEcNvOB/O7qZQA2DkxLwbCTyyrLemAxWYJk3wc/fD1/BctT3bDG44NHe2A3dKAO7mcVZ67z+m4cSOqELUS5wbNbV4D8uwNfC7IB0O5fHpjJZYpD4N/0avy2BN/DMxpI2o8Aq3EtAbdgb9CKaNJ9DplO9R9Nq0f60+qzXWn16eOgdnaA2p3CdAzUwz3r+988f/P88uSv7wPEn/pu9sjlLyQY/5zIpz6TpZe/jJHTX8XlF1Nt0lR3lzRFWbLJSTpEztACeZMWyVt0mEzRETJLS2SONrE8huUXsHwSy8/JU/S4PEv75Tk6Lp+jr8gz9FX5An1Nvkhfl5foG/LHtI71Dax/h5yj75IZOkku0PfIRXqWLFGMhWIsFGOhGAvFWCjGvJVpvp0sqGS+kyx0kQ+/pXT+QJAlyVyapCi9TFd+Of0AU/0XbmySzZ5fIBAI1rOnOynbmA/r5TJ/4BRHS/kYE1xaFI2Jl5izBvS3mV+jlPpe3sPnPfx8Sm1jXcsTEw5fW5BLOwAqvu6ydYVge0lIMonF29S75YqyY2dC2dWOufJPeceju7s2So/t6dy7Udq3/8knNkrJh5zUPdju+DbLvb5ftXVcDdkZ8l98xwV3R/z+txbx+9/49++4ejkFf9+fDuD+dAD3p5iODeD+1MOObInxf9+HOk7NZSusxeQgjFSrI3w5Zlq6ycXxnBKXE1XbZiLV/aGgxtVNk70Iiit+ZFDP13ivpDNkVZgsxg7g53DTzbMOCgxXm14snMmS53t8pPhBAmAXjAprWVkiYBsVn5/M8Yb4Sx9NCdI0rMZvgyRZFaPAOqjFUTtYQFZca4idYvl53y3yKgnF4G2W5jmBZCLJRqKVq0yIlYkkG4lmZvg4ViaSbCSaWWeiYFM9PCqQRMmqaOwy2HMIPdPi2RbvjdxrWJbMb4fh2pno1qBnI/cahs96SJJXdEfZSQZzumGw5iaWcvkiv1fxHM5CdEzOK47d8QKfE8jVzXIo4dXnvLFgLvHYUOyyH8xuw9SDV3m6wcM6lPiJoPOwPvJXZNcwef0jrLNhZqMVO951PsO7mIdxJs9egkron7S3g5E37lxq3si2eG+L97V4bu12VPy1b5DvVe3IG6VwTIV7tsV7o9jQ+6J6G6+LbxfGv+G7CSxnWVn6jXJ8o1pjfVljQ69b07D9dCgpDIa9QcWcCgQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgeOgBsCpmiv1bwJ+v4hVL' - const response = await fetch(stateDataUrl) - const state = await response.blob() - nostalgist = await Nostalgist.nes({ rom: 'flappybird.nes', state }) -} - -async function saveState() { - state = await nostalgist.saveState() -} - -async function loadState() { - await nostalgist.loadState(state.state) -} - -function pause() { - nostalgist.pause() -} - -function resume() { - nostalgist.resume() -} - -function restart() { - nostalgist.restart() -} - -function resize() { - nostalgist.resize({ height: 400, width: 400 }) -} - -async function screenshot() { - const blob = await nostalgist.screenshot() - const img = new Image() - img.src = URL.createObjectURL(blob) - document.body.append(img) - console.info(blob) -} - -function exit() { - nostalgist.exit({ removeCanvas: false }) -} - -function getCurrentNostalgist() { - return nostalgist -} - -Nostalgist.configure({ - style: { height: '600px', position: 'static', width: '800px' }, - - onLaunch(instance) { - globalThis.nostalgist = instance - }, -}) - -document.body.addEventListener('click', async function listener({ target }) { - if (!(target instanceof HTMLButtonElement)) { - return - } - const handlers = { - exit, - gbc, - launchCustomRom, - launchFceummWithCoreConfig, - launchFceummWithRaLegacy, - launchNestopia, - launchState, - loadState, - megadrive, - nes, - pause, - resize, - restart, - resume, - saveState, - screenshot, - } - const textContent = target.textContent || '' - if (textContent in handlers) { - const handler = handlers[textContent] - await handler() - target.blur() - } - Object.assign(globalThis, { nostalgist }) -}) - -globalThis.Nostalgist = Nostalgist -globalThis.getCurrentNostalgist = getCurrentNostalgist diff --git a/demo/index.html b/demo/index.html deleted file mode 100644 index b0fc638..0000000 --- a/demo/index.html +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - Nostalgist.js demo page - - - - -
-

static methods

- - - - - - - - -

instance methods

- - - - - - - - -
- - - diff --git a/package.json b/package.json index b7102ab..0ec8167 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ ], "scripts": { "build": "node scripts/build.ts && tsc", - "dev": "vite demo", + "dev": "vite playground --open", "dev:e2e": "playwright test -c tests/e2e --ui", "docs:build": "astro build --root docs", "docs:dev": "astro dev --root docs", diff --git a/playground/activate.ts b/playground/activate.ts new file mode 100644 index 0000000..bcc2390 --- /dev/null +++ b/playground/activate.ts @@ -0,0 +1,149 @@ +import type { Nostalgist as Nostalgist_ } from '../src/index.ts' + +let Nostalgist: typeof Nostalgist_ +let nostalgist: Nostalgist_ +let state: { state: Blob } + +const handlers = { + async nes() { + nostalgist = await Nostalgist.nes('pong1k.nes') + }, + + async megadrive() { + nostalgist = await Nostalgist.megadrive('asciiwar.bin') + }, + + async gbc() { + nostalgist = await Nostalgist.gbc('combatsoccer.gbc') + }, + + async launchSize() { + nostalgist = await Nostalgist.gbc({ rom: 'combatsoccer.gbc', size: { height: 100, width: 100 } }) + }, + + async launchShader() { + nostalgist = await Nostalgist.launch({ core: 'genesis_plus_gx', rom: 'asciiwar.bin', shader: 'crt/crt-geom' }) + }, + + async launchAndCancel() { + const abortController = new AbortController() + setTimeout(() => { + abortController.abort() + }, 500) + nostalgist = await Nostalgist.nes({ rom: 'pong1k.nes', signal: abortController.signal }) + }, + + async launchWithHooks() { + nostalgist = await Nostalgist.nes({ + async beforeLaunch(nostalgist) { + globalThis.nostalgist = nostalgist + console.warn(typeof nostalgist, 'beforeLaunch') + await new Promise((resolve) => { + setTimeout(resolve, 100) + }) + }, + onLaunch(nostalgist) { + console.warn(typeof nostalgist, 'onLaunch') + }, + rom: 'pong1k.nes', + }) + }, + + async launchState() { + const stateDataUrl = + 'data:application/octet-stream;base64,I1JaSVB2ASMAAAIAuDUAAAAAAABBBAAAeJztmt9rHEUcwL+7cxe3PZqNtUnR1usd1DaxFfYuOSw2kuztj9wl92Ozu3fXi7VULPEn5MUfsc1DJEEsTUKgYJGIlEBfqmgrItXH/gUB9clnqW8W8uKDMn5ndjc9o01LYwzF+ZC5+cyPnf3uzh07s8TVPV/3LalslVOf5gBsw6MLmNcOAUcqKACOASBjYd+MzqowOSdCgWYkXih/OKEcNvOB/O7qZQA2DkxLwbCTyyrLemAxWYJk3wc/fD1/BctT3bDG44NHe2A3dKAO7mcVZ67z+m4cSOqELUS5wbNbV4D8uwNfC7IB0O5fHpjJZYpD4N/0avy2BN/DMxpI2o8Aq3EtAbdgb9CKaNJ9DplO9R9Nq0f60+qzXWn16eOgdnaA2p3CdAzUwz3r+988f/P88uSv7wPEn/pu9sjlLyQY/5zIpz6TpZe/jJHTX8XlF1Nt0lR3lzRFWbLJSTpEztACeZMWyVt0mEzRETJLS2SONrE8huUXsHwSy8/JU/S4PEv75Tk6Lp+jr8gz9FX5An1Nvkhfl5foG/LHtI71Dax/h5yj75IZOkku0PfIRXqWLFGMhWIsFGOhGAvFWCjGvJVpvp0sqGS+kyx0kQ+/pXT+QJAlyVyapCi9TFd+Of0AU/0XbmySzZ5fIBAI1rOnOynbmA/r5TJ/4BRHS/kYE1xaFI2Jl5izBvS3mV+jlPpe3sPnPfx8Sm1jXcsTEw5fW5BLOwAqvu6ydYVge0lIMonF29S75YqyY2dC2dWOufJPeceju7s2So/t6dy7Udq3/8knNkrJh5zUPdju+DbLvb5ftXVcDdkZ8l98xwV3R/z+txbx+9/49++4ejkFf9+fDuD+dAD3p5iODeD+1MOObInxf9+HOk7NZSusxeQgjFSrI3w5Zlq6ycXxnBKXE1XbZiLV/aGgxtVNk70Iiit+ZFDP13ivpDNkVZgsxg7g53DTzbMOCgxXm14snMmS53t8pPhBAmAXjAprWVkiYBsVn5/M8Yb4Sx9NCdI0rMZvgyRZFaPAOqjFUTtYQFZca4idYvl53y3yKgnF4G2W5jmBZCLJRqKVq0yIlYkkG4lmZvg4ViaSbCSaWWeiYFM9PCqQRMmqaOwy2HMIPdPi2RbvjdxrWJbMb4fh2pno1qBnI/cahs96SJJXdEfZSQZzumGw5iaWcvkiv1fxHM5CdEzOK47d8QKfE8jVzXIo4dXnvLFgLvHYUOyyH8xuw9SDV3m6wcM6lPiJoPOwPvJXZNcwef0jrLNhZqMVO951PsO7mIdxJs9egkron7S3g5E37lxq3si2eG+L97V4bu12VPy1b5DvVe3IG6VwTIV7tsV7o9jQ+6J6G6+LbxfGv+G7CSxnWVn6jXJ8o1pjfVljQ69b07D9dCgpDIa9QcWcCgQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgeOgBsCpmiv1bwJ+v4hVL' + const response = await fetch(stateDataUrl) + const state = await response.blob() + nostalgist = await Nostalgist.nes({ rom: 'flappybird.nes', state }) + }, + + async saveState() { + state = await nostalgist.saveState() + console.info(state) + }, + + async loadState() { + await nostalgist.loadState(state.state) + }, + + pause() { + nostalgist.pause() + }, + + resume() { + nostalgist.resume() + }, + + restart() { + nostalgist.restart() + }, + + resize() { + nostalgist.resize({ height: 400, width: 400 }) + }, + + async pressA() { + await nostalgist.press('a') + }, + + async pressStart() { + await nostalgist.press('start') + }, + + async screenshot() { + const blob = await nostalgist.screenshot() + const image = new Image() + image.id = 'screenshot' + image.src = URL.createObjectURL(blob) + image.style.display = 'block' + image.style.margin = '1em auto 0 auto' + await new Promise((resolve) => { + image.addEventListener('load', resolve) + }) + document.body.append(image) + }, +} +export function activate(mod: typeof Nostalgist_) { + const nostalgistConfig = { + style: { + backgroundColor: 'transparent', + display: 'block', + height: '600px', + margin: '1em auto 0 auto', + position: 'static', + width: '800px', + }, + } + + if (location.search.includes('e2e-legacy')) { + const cdnBaseUrl = 'https://cdn.jsdelivr.net/gh' + + const coreRepo = 'arianrhodsandlot/retroarch-emscripten-build' + const coreVersion = 'v1.16.0' + const coreDirectory = 'retroarch' + + Object.assign(nostalgistConfig, { + resolveCoreJs(core) { + return `${cdnBaseUrl}/${coreRepo}@${coreVersion}/${coreDirectory}/${core}_libretro.js` + }, + resolveCoreWasm(core) { + return `${cdnBaseUrl}/${coreRepo}@${coreVersion}/${coreDirectory}/${core}_libretro.wasm` + }, + }) + } + + Nostalgist = mod + Nostalgist.configure(nostalgistConfig) + + document.body.addEventListener('click', async function listener({ target }) { + if (!(target instanceof HTMLButtonElement && target.textContent)) { + return + } + target.disabled = true + try { + await handlers[target.textContent]() + } catch {} + target.disabled = false + target.blur() + }) +} diff --git a/tests/e2e/test-page/index.html b/playground/index.html similarity index 52% rename from tests/e2e/test-page/index.html rename to playground/index.html index b1aa10b..f20840a 100644 --- a/tests/e2e/test-page/index.html +++ b/playground/index.html @@ -3,13 +3,32 @@ - Nostalgist.js test page + Nostalgist.js Playground - + + -
-

static methods

+

+ + Nostalgist.js Playground +

+
+

Static Methods

@@ -18,7 +37,7 @@

static methods

-

instance methods

+

Instance Methods

@@ -29,7 +48,15 @@

instance methods

- - + + diff --git a/tests/e2e/instance-ra-esm.spec.ts b/tests/e2e/instance-ra-esm.spec.ts index 4fff0f7..7da4050 100644 --- a/tests/e2e/instance-ra-esm.spec.ts +++ b/tests/e2e/instance-ra-esm.spec.ts @@ -3,8 +3,8 @@ import { tests } from './instance-ra-common' test.describe('instance methods with retroarch esm', () => { test.beforeEach(async ({ page }) => { - await page.goto('/tests/e2e/test-page') + await page.goto('/?e2e') }) - test('tests', tests) + tests() }) diff --git a/tests/e2e/instance-ra-legacy.spec.ts b/tests/e2e/instance-ra-legacy.spec.ts index 41ae070..8b34b8a 100644 --- a/tests/e2e/instance-ra-legacy.spec.ts +++ b/tests/e2e/instance-ra-legacy.spec.ts @@ -3,8 +3,8 @@ import { tests } from './instance-ra-common' test.describe('instance methods with retroarch legacy', () => { test.beforeEach(async ({ page }) => { - await page.goto('/tests/e2e/test-page?legacy') + await page.goto('/?e2e-legacy') }) - test('tests', tests) + tests() }) diff --git a/tests/e2e/playwright.config.ts b/tests/e2e/playwright.config.ts index 433a4e0..5fb0cad 100644 --- a/tests/e2e/playwright.config.ts +++ b/tests/e2e/playwright.config.ts @@ -8,6 +8,6 @@ export default defineConfig({ snapshotPathTemplate: '{testDir}/snapshots/{testFilePath}/{testName}/{arg}{ext}', testMatch: 'tests/e2e/**/*.spec.ts', updateSnapshots: 'missing', - use: { baseURL: 'http://localhost:8000/', headless: true }, - webServer: { command: 'python3 -m http.server', cwd: '../..', port: 8000, reuseExistingServer: false }, + use: { baseURL: 'http://localhost:5173/', headless: true }, + webServer: { command: 'vite playground', cwd: '../..', port: 5173, reuseExistingServer: true }, }) diff --git a/tests/e2e/static-ra-esm.spec.ts b/tests/e2e/static-ra-esm.spec.ts index f0d5f0e..a34b889 100644 --- a/tests/e2e/static-ra-esm.spec.ts +++ b/tests/e2e/static-ra-esm.spec.ts @@ -3,8 +3,8 @@ import { tests } from './static-ra-common' test.describe('static methods with retroarch esm', () => { test.beforeEach(async ({ page }) => { - await page.goto('/tests/e2e/test-page') + await page.goto('/?e2e') }) - test('tests', tests) + tests() }) diff --git a/tests/e2e/static-ra-legacy.spec.ts b/tests/e2e/static-ra-legacy.spec.ts index c4526e9..48f139a 100644 --- a/tests/e2e/static-ra-legacy.spec.ts +++ b/tests/e2e/static-ra-legacy.spec.ts @@ -3,8 +3,8 @@ import { tests } from './static-ra-common' test.describe('static methods with retroarch legacy', () => { test.beforeEach(async ({ page }) => { - await page.goto('/tests/e2e/test-page?legacy') + await page.goto('/?e2e-legacy') }) - test('tests', tests) + tests() }) diff --git a/tests/e2e/test-page/test-page.css b/tests/e2e/test-page/test-page.css deleted file mode 100644 index 830576d..0000000 --- a/tests/e2e/test-page/test-page.css +++ /dev/null @@ -1,4 +0,0 @@ -* { - margin: 0; - padding: 0; -} diff --git a/tests/e2e/test-page/test-page.js b/tests/e2e/test-page/test-page.js deleted file mode 100644 index e260a6b..0000000 --- a/tests/e2e/test-page/test-page.js +++ /dev/null @@ -1,161 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-nocheck - -let nostalgist -let state - -const { Nostalgist } = globalThis - -async function nes() { - nostalgist = await Nostalgist.nes('pong1k.nes') -} - -async function megadrive() { - nostalgist = await Nostalgist.megadrive('asciiwar.bin') -} - -async function gbc() { - nostalgist = await Nostalgist.gbc('combatsoccer.gbc') -} - -async function launchSize() { - nostalgist = await Nostalgist.gbc({ rom: 'combatsoccer.gbc', size: { height: 100, width: 100 } }) -} - -async function launchShader() { - nostalgist = await Nostalgist.launch({ core: 'genesis_plus_gx', rom: 'asciiwar.bin', shader: 'crt/crt-geom' }) -} - -async function launchAndCancel() { - const abortController = new AbortController() - setTimeout(() => { - abortController.abort() - }, 500) - nostalgist = await Nostalgist.nes({ rom: 'pong1k.nes', signal: abortController.signal }) -} - -async function launchWithHooks() { - nostalgist = await Nostalgist.nes({ - async beforeLaunch(nostalgist) { - console.warn(typeof nostalgist, 'beforeLaunch') - await new Promise((resolve) => { - setTimeout(resolve, 100) - }) - }, - onLaunch(nostalgist) { - console.warn(typeof nostalgist, 'onLaunch') - }, - rom: 'pong1k.nes', - }) -} - -async function launchState() { - const stateDataUrl = - 'data:application/octet-stream;base64,I1JaSVB2ASMAAAIAuDUAAAAAAABBBAAAeJztmt9rHEUcwL+7cxe3PZqNtUnR1usd1DaxFfYuOSw2kuztj9wl92Ozu3fXi7VULPEn5MUfsc1DJEEsTUKgYJGIlEBfqmgrItXH/gUB9clnqW8W8uKDMn5ndjc9o01LYwzF+ZC5+cyPnf3uzh07s8TVPV/3LalslVOf5gBsw6MLmNcOAUcqKACOASBjYd+MzqowOSdCgWYkXih/OKEcNvOB/O7qZQA2DkxLwbCTyyrLemAxWYJk3wc/fD1/BctT3bDG44NHe2A3dKAO7mcVZ67z+m4cSOqELUS5wbNbV4D8uwNfC7IB0O5fHpjJZYpD4N/0avy2BN/DMxpI2o8Aq3EtAbdgb9CKaNJ9DplO9R9Nq0f60+qzXWn16eOgdnaA2p3CdAzUwz3r+988f/P88uSv7wPEn/pu9sjlLyQY/5zIpz6TpZe/jJHTX8XlF1Nt0lR3lzRFWbLJSTpEztACeZMWyVt0mEzRETJLS2SONrE8huUXsHwSy8/JU/S4PEv75Tk6Lp+jr8gz9FX5An1Nvkhfl5foG/LHtI71Dax/h5yj75IZOkku0PfIRXqWLFGMhWIsFGOhGAvFWCjGvJVpvp0sqGS+kyx0kQ+/pXT+QJAlyVyapCi9TFd+Of0AU/0XbmySzZ5fIBAI1rOnOynbmA/r5TJ/4BRHS/kYE1xaFI2Jl5izBvS3mV+jlPpe3sPnPfx8Sm1jXcsTEw5fW5BLOwAqvu6ydYVge0lIMonF29S75YqyY2dC2dWOufJPeceju7s2So/t6dy7Udq3/8knNkrJh5zUPdju+DbLvb5ftXVcDdkZ8l98xwV3R/z+txbx+9/49++4ejkFf9+fDuD+dAD3p5iODeD+1MOObInxf9+HOk7NZSusxeQgjFSrI3w5Zlq6ycXxnBKXE1XbZiLV/aGgxtVNk70Iiit+ZFDP13ivpDNkVZgsxg7g53DTzbMOCgxXm14snMmS53t8pPhBAmAXjAprWVkiYBsVn5/M8Yb4Sx9NCdI0rMZvgyRZFaPAOqjFUTtYQFZca4idYvl53y3yKgnF4G2W5jmBZCLJRqKVq0yIlYkkG4lmZvg4ViaSbCSaWWeiYFM9PCqQRMmqaOwy2HMIPdPi2RbvjdxrWJbMb4fh2pno1qBnI/cahs96SJJXdEfZSQZzumGw5iaWcvkiv1fxHM5CdEzOK47d8QKfE8jVzXIo4dXnvLFgLvHYUOyyH8xuw9SDV3m6wcM6lPiJoPOwPvJXZNcwef0jrLNhZqMVO951PsO7mIdxJs9egkron7S3g5E37lxq3si2eG+L97V4bu12VPy1b5DvVe3IG6VwTIV7tsV7o9jQ+6J6G6+LbxfGv+G7CSxnWVn6jXJ8o1pjfVljQ69b07D9dCgpDIa9QcWcCgQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgeOgBsCpmiv1bwJ+v4hVL' - const response = await fetch(stateDataUrl) - const state = await response.blob() - nostalgist = await Nostalgist.nes({ rom: 'flappybird.nes', state }) -} - -async function saveState() { - state = await nostalgist.saveState() - console.info(state) -} - -async function loadState() { - await nostalgist.loadState(state.state) -} - -function pause() { - nostalgist.pause() -} - -function resume() { - nostalgist.resume() -} - -function restart() { - nostalgist.restart() -} - -function resize() { - nostalgist.resize(400, 400) -} - -async function pressA() { - await nostalgist.press('a') -} - -async function pressStart() { - await nostalgist.press('start') -} - -async function screenshot() { - const blob = await nostalgist.screenshot() - const image = new Image() - image.id = 'screenshot' - image.src = URL.createObjectURL(blob) - await new Promise((resolve) => { - image.addEventListener('load', resolve) - }) - document.body.append(image) -} - -const nostalgistConfig = { - style: { - backgroundColor: 'transparent', - height: '600px', - position: 'static', - width: '800px', - }, -} - -if (location.search.includes('legacy')) { - const cdnBaseUrl = 'https://cdn.jsdelivr.net/gh' - - const coreRepo = 'arianrhodsandlot/retroarch-emscripten-build' - const coreVersion = 'v1.16.0' - const coreDirectory = 'retroarch' - - Object.assign(nostalgistConfig, { - resolveCoreJs(core) { - return `${cdnBaseUrl}/${coreRepo}@${coreVersion}/${coreDirectory}/${core}_libretro.js` - }, - resolveCoreWasm(core) { - return `${cdnBaseUrl}/${coreRepo}@${coreVersion}/${coreDirectory}/${core}_libretro.wasm` - }, - }) -} - -Nostalgist.configure(nostalgistConfig) - -document.body.addEventListener('click', async function listener({ target }) { - if (!(target instanceof HTMLButtonElement)) { - return - } - const handlers = { - gbc, - launchAndCancel, - launchShader, - launchSize, - launchState, - launchWithHooks, - loadState, - megadrive, - nes, - pause, - pressA, - pressStart, - resize, - restart, - resume, - saveState, - screenshot, - } - const textContent = target.textContent || '' - if (textContent in handlers) { - const handler = handlers[textContent] - await handler() - target.blur() - } -})