From df20979afa00bd578922a6a516b28845a4b5cab3 Mon Sep 17 00:00:00 2001 From: Simeon Radivoev Date: Sun, 15 Mar 2026 16:43:07 +0200 Subject: [PATCH] fix: Fixed cross platform errors and emulatorjs not opening on linux --- src/bun/api/clients.ts | 2 ++ src/bun/api/games/games.ts | 7 ++++-- src/bun/api/games/platforms.ts | 2 ++ src/bun/server.ts | 18 +++++++-------- src/mainview/routes/embedded.$source.$id.tsx | 23 ++++++++++++++------ vite.config.ts | 5 +++++ 6 files changed, 39 insertions(+), 18 deletions(-) diff --git a/src/bun/api/clients.ts b/src/bun/api/clients.ts index b444eb6..ef4741c 100644 --- a/src/bun/api/clients.ts +++ b/src/bun/api/clients.ts @@ -9,6 +9,8 @@ export default new Elysia({ prefix: "/api/romm" }) .use([games, platforms, auth]) .all("/*", async ({ request, params, set }) => { + set.headers["cross-origin-resource-policy"] = 'cross-origin'; + if (!config.has('rommAddress') && !config.get('rommAddress')) { return new Response("Romm Address Not Found", { status: 404 }); diff --git a/src/bun/api/games/games.ts b/src/bun/api/games/games.ts index d9fe0ce..ef1d8c9 100644 --- a/src/bun/api/games/games.ts +++ b/src/bun/api/games/games.ts @@ -74,21 +74,24 @@ export default new Elysia() params: z.object({ id: z.coerce.number() }), query: z.object({ blur: z.coerce.number().optional(), width: z.coerce.number().optional(), height: z.coerce.number().optional() }) }) - .get('/image/:source/*', async ({ params: { source, "*": path }, query }) => + .get('/image/:source/*', async ({ params: { source, "*": path }, query, set }) => { if (source === 'romm') { + set.headers["cross-origin-resource-policy"] = 'cross-origin'; const rommAdress = config.get('rommAddress'); return processImage(`${rommAdress}/${path}`, query); } return status('Not Found'); }, { query: z.object({ blur: z.coerce.number().optional(), width: z.coerce.number().optional(), height: z.coerce.number().optional(), noBlur: z.coerce.boolean().optional() }) }) - .get('/image', async ({ query }) => + .get('/image', async ({ query, set }) => { + set.headers["cross-origin-resource-policy"] = 'cross-origin'; return processImage(query.url, query); }, { query: z.object({ url: z.url(), blur: z.coerce.number().optional(), width: z.coerce.number().optional(), height: z.coerce.number().optional() }) }) .get('/screenshot/:id', async ({ params: { id }, query, set }) => { + set.headers["cross-origin-resource-policy"] = 'cross-origin'; const screenshot = await db.query.screenshots.findFirst({ where: eq(schema.screenshots.id, id), columns: { content: true, type: true } }); if (screenshot) { diff --git a/src/bun/api/games/platforms.ts b/src/bun/api/games/platforms.ts index d8a1e9c..73e0347 100644 --- a/src/bun/api/games/platforms.ts +++ b/src/bun/api/games/platforms.ts @@ -121,6 +121,8 @@ export default new Elysia() return status("Not Implemented"); }, { params: z.object({ source: z.string(), id: z.coerce.number() }) }).get('/platform/local/:id/cover', async ({ params: { id }, set }) => { + set.headers["cross-origin-resource-policy"] = 'cross-origin'; + const coverBlob = await db.query.platforms.findFirst({ columns: { cover: true, cover_type: true diff --git a/src/bun/server.ts b/src/bun/server.ts index 58fd64a..c33dc51 100644 --- a/src/bun/server.ts +++ b/src/bun/server.ts @@ -12,25 +12,25 @@ export function RunBunServer () console.log("Launching Server on port ", SERVER_PORT); return new Elysia() .use(cors()) + .headers({ + 'cross-origin-embedder-policy': 'credentialless', + 'cross-origin-opener-policy': 'same-origin', + 'cross-origin-resource-policy': 'cross-origin' + }) .get("/", ({ set }) => { - set.headers['cross-origin-opener-policy'] = 'same-origin'; - set.headers['cross-origin-embedder-policy'] = 'require-corp'; - return file("./dist/index.html"); + return Bun.file(appPath("./dist/index.html")); }) .get('/emulatorjs', ({ set }) => { - set.headers['cross-origin-opener-policy'] = 'same-origin'; - set.headers['cross-origin-embedder-policy'] = 'require-corp'; - set.headers['cross-origin-resource-policy'] = 'cross-origin'; - return file('./dist/emulatorjs/index.html'); + return Bun.file(appPath('./dist/emulatorjs/index.html')); }) .use(staticPlugin({ indexHTML: false, - assets: "dist", + assets: appPath("./dist"), prefix: "/", alwaysStatic: true - })).listen({ port: SERVER_PORT, hostname: host }, console.log); + })).listen({ port: SERVER_PORT, hostname: host, development: true }, console.log); /*return Bun.serve({ port: SERVER_PORT, hostname: host, diff --git a/src/mainview/routes/embedded.$source.$id.tsx b/src/mainview/routes/embedded.$source.$id.tsx index 8f09d49..b461846 100644 --- a/src/mainview/routes/embedded.$source.$id.tsx +++ b/src/mainview/routes/embedded.$source.$id.tsx @@ -118,9 +118,7 @@ function Frame (data: { ref: RefObject; }) data.ref.current = r; }} allow='fullscreen; cross-origin-isolated' - className='absolute w-full h-full transition-[padding]' src={ - __PUBLIC__ ? `${SERVER_URL(__HOST__)}/emulatorjs/?${params}` : `${EMULATORJS_URL(__HOST__)}/?${params}` - }>; + className='absolute w-full h-full transition-[padding]' src={`${SERVER_URL(__HOST__)}/emulatorjs/?${params}`}>; } function RouteComponent () @@ -147,12 +145,23 @@ function RouteComponent () } }); - useShortcuts(focusKey, () => [{ - button: GamePadButtonCode.Steam, action: () => + useShortcuts(focusKey, () => [ { - setOverlayOpen(!overlayOpen); + button: GamePadButtonCode.Steam, + action: () => + { + setOverlayOpen(!overlayOpen); + } + }, + { + button: GamePadButtonCode.Select, + heldTime: 1000, + action: () => + { + setOverlayOpen(!overlayOpen); + } } - }], [overlayOpen, setOverlayOpen]); + ], [overlayOpen, setOverlayOpen]); const setPaused = (paused: boolean) => { diff --git a/vite.config.ts b/vite.config.ts index 2dd2825..7ab665c 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -49,6 +49,7 @@ export default defineConfig(({ command }) => minify: production, sourcemap: production ? false : 'inline', rollupOptions: { + preserveEntrySignatures: 'strict', input: { main: 'src/mainview/index.html', login: 'src/mainview/auth/qr/index.html', @@ -58,6 +59,10 @@ export default defineConfig(({ command }) => manualChunks: (id ) => { + if (id.includes('@emulatorjs')) + { + return 'emulatorjs'; + } if (id .includes ('node_modules'))