tyndale-ai-frontend/server.js

53 lines
1.4 KiB
JavaScript

const express = require('express');
const path = require('path');
const { GoogleAuth } = require('google-auth-library');
const app = express();
app.use(express.json({ limit: '1mb' }));
const BACKEND_URL = process.env.BACKEND_URL;
if (!BACKEND_URL) {
console.error('FATAL: BACKEND_URL env var is required');
process.exit(1);
}
const auth = new GoogleAuth();
app.get('/health', (_req, res) => {
res.status(200).json({ status: 'ok' });
});
app.post('/api/chat', async (req, res) => {
try {
// Create an ID-token authenticated client for the backend (audience = BACKEND_URL)
const idTokenClient = await auth.getIdTokenClient(BACKEND_URL);
// Forward request to backend
const backendResp = await idTokenClient.request({
url: `${BACKEND_URL}/chat`,
method: 'POST',
data: req.body,
});
res.status(backendResp.status).json(backendResp.data);
} catch (err) {
console.error('Proxy error:', err.message);
const status = err.response?.status || 500;
const message = err.response?.data || { error: err.message };
res.status(status).json(message);
}
});
// Serve static assets
app.use(express.static(path.join(__dirname, 'dist')));
// SPA fallback
app.get('*', (_req, res) => {
res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});
const port = parseInt(process.env.PORT || '8080', 10);
app.listen(port, '0.0.0.0', () => {
console.log(`Frontend proxy listening on port ${port}`);
});