feat: Implemented launching and downloading of roms

This is just an initial implementation lots of kings to iron out
This commit is contained in:
Simeon Radivoev 2026-02-19 16:10:29 +02:00
parent ef08fa6114
commit f15bf9a1e0
Signed by: simeonradivoev
GPG key ID: 7611A451D2A5D37A
117 changed files with 37776 additions and 1073 deletions

View file

@ -2,6 +2,8 @@ import { RunBunServer } from './server';
import { RunAPIServer } from './api/rpc';
import { spawnBrowser } from './utils/browser-spawner';
import { BuildParams } from './utils/browser-params';
import { cleanup as appCleanup, events } from './api/app';
import os from 'node:os';
const api = RunAPIServer();
let bunServer: { stop: () => void; url: URL; } | undefined;
@ -13,43 +15,80 @@ if (!Bun.env.PUBLIC_ACCESS)
async function cleanup ()
{
await appCleanup();
bunServer?.stop();
await api.apiServer.stop();
await api.cleanup();
process.exit(0);
}
try
if (Bun.env.FORCE_BROWSER)
{
const webviewWorker = new Worker(process.env.IS_BINARY ? "./webview-worker.ts" : new URL("./webview-worker", import.meta.url).href, {
await runBrowser();
} else
{
try
{
await runWebview();
} catch (error)
{
await runBrowser();
}
}
async function runWebview ()
{
const webviewWorker = new Worker(Bun.env.IS_BINARY ? `./webview/${os.platform()}.ts` : new URL(`./webview/${os.platform()}`, import.meta.url).href, {
smol: true,
});
webviewWorker.addEventListener('error', console.error);
await new Promise(resolve => webviewWorker.addEventListener('close', resolve));
await new Promise((resolve, reject) =>
{
webviewWorker.addEventListener('error', e =>
{
console.error(e.message);
reject(e.error);
});
webviewWorker.addEventListener('message', (e) =>
{
if (e.data === 'destroyed')
{
resolve(true);
}
});
events.on('exitapp', () =>
{
resolve(true);
});
});
await cleanup();
}
catch (error)
async function runBrowser ()
{
console.error(error);
const browserParams = await BuildParams();
if (!browserParams)
{
console.error("Could not find valid browser");
process.exit();
}
await cleanup();
} else
{
const browser = spawnBrowser({
browser: browserParams.browser.type,
args: browserParams.args,
env: browserParams.env,
detached: false,
execPath: browserParams.browser.path,
source: browserParams.browser.source,
ipc (message)
{
console.log(message);
},
onExit: cleanup
});
const browser = spawnBrowser({
browser: browserParams.browser.type,
args: browserParams.args,
env: browserParams.env,
detached: true,
execPath: browserParams.browser.path,
source: browserParams.browser.source,
ipc (message)
{
console.log(message);
},
onExit: cleanup
});
events.on('exitapp', () => browser.kill(15));
}
}