58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { defineConfig } from 'vite'
|
|
import react from '@vitejs/plugin-react'
|
|
|
|
// https://vitejs.dev/config/
|
|
export default defineConfig({
|
|
plugins: [react()],
|
|
envPrefix: ['VITE_', 'ROMM_'],
|
|
server: {
|
|
watch: {
|
|
usePolling: true,
|
|
},
|
|
cors: true,
|
|
proxy: {
|
|
'/api': {
|
|
target: 'https://retro.chieflix.com',
|
|
changeOrigin: true,
|
|
secure: false,
|
|
configure: (proxy: any) => {
|
|
proxy.on('proxyReq', (proxyReq: any, req: any) => {
|
|
// New Token Path Strategy: Extract token from URL path to prevent EmulatorJS extension parsing bugs
|
|
// Match format: /api/roms/123/content/token/XYZ/rom.chd
|
|
const tokenMatch = req.url?.match(/\/content\/token\/([^/]+)\/(.*)/);
|
|
if (tokenMatch) {
|
|
const token = tokenMatch[1];
|
|
const restOfPath = tokenMatch[2];
|
|
|
|
// Inject the token securely
|
|
proxyReq.setHeader('Authorization', `Bearer ${token}`);
|
|
|
|
// Rewrite the proxy request path to hide the token and the false filename from the RomM backend
|
|
// E.g., /api/roms/123/content/token/TOKEN/game.nds -> /api/roms/123/content
|
|
let newPath = req.url.replace(/\/content\/token\/[^/]+\/.*/, '/content');
|
|
|
|
// EJS loader often fires HEAD requests to check content-length. RomM FastAPI natively drops HEAD methods on binary routes returning 404s.
|
|
// Mutate HEAD queries safely into GET queries so the backend responds with accurate Header structures.
|
|
if (req.method === 'HEAD') {
|
|
proxyReq.method = 'GET';
|
|
}
|
|
|
|
proxyReq.path = newPath;
|
|
} else {
|
|
// Fallback for regular query params (Saves/States)
|
|
const url = new URL(req.url || '', `http://${req.headers.host}`);
|
|
const token = url.searchParams.get('access_token');
|
|
if (token) {
|
|
proxyReq.setHeader('Authorization', `Bearer ${token}`);
|
|
}
|
|
}
|
|
});
|
|
proxy.on('proxyRes', (proxyRes: any) => {
|
|
proxyRes.headers['Cross-Origin-Resource-Policy'] = 'cross-origin';
|
|
});
|
|
}
|
|
}
|
|
}
|
|
},
|
|
})
|