Some checks failed
Queue Release Build / prepare (push) Successful in 25s
Deploy Web Apps / deploy (push) Successful in 17m20s
Queue Release Build / finalize (push) Has been cancelled
Queue Release Build / build-linux (push) Has started running
Queue Release Build / build-windows (push) Has been cancelled
103 lines
2.4 KiB
TypeScript
103 lines
2.4 KiB
TypeScript
import { APP_BASE_HREF } from '@angular/common';
|
|
import { CommonEngine, isMainModule } from '@angular/ssr/node';
|
|
import express from 'express';
|
|
import {
|
|
dirname,
|
|
join,
|
|
resolve
|
|
} from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import bootstrap from './main.server';
|
|
|
|
const serverDistFolder = dirname(fileURLToPath(import.meta.url));
|
|
const browserDistFolder = resolve(serverDistFolder, '../browser');
|
|
const indexHtml = join(serverDistFolder, 'index.server.html');
|
|
const app = express();
|
|
const commonEngine = new CommonEngine({
|
|
allowedHosts: [
|
|
'toju.app',
|
|
'www.toju.app',
|
|
'localhost',
|
|
'127.0.0.1'
|
|
]
|
|
});
|
|
|
|
app.set('trust proxy', 'loopback');
|
|
|
|
/**
|
|
* Proxy endpoint for Gitea releases API to avoid CORS issues.
|
|
*/
|
|
app.get('/api/releases', async (_request, response) => {
|
|
try {
|
|
const upstreamResponse = await fetch('https://git.azaaxin.com/api/v1/repos/myxelium/Toju/releases', {
|
|
headers: { Accept: 'application/json' }
|
|
});
|
|
|
|
if (!upstreamResponse.ok) {
|
|
response.status(upstreamResponse.status).json({
|
|
error: `Upstream returned ${upstreamResponse.status}`
|
|
});
|
|
|
|
return;
|
|
}
|
|
|
|
const data = await upstreamResponse.json();
|
|
|
|
response.setHeader('Cache-Control', 'public, max-age=300');
|
|
response.json(data);
|
|
} catch (error) {
|
|
console.error('Proxy fetch error:', error);
|
|
response.status(502).json({
|
|
error: 'Failed to fetch releases from upstream'
|
|
});
|
|
}
|
|
});
|
|
|
|
/**
|
|
* Serve static files from /browser.
|
|
*/
|
|
app.get(
|
|
'**',
|
|
express.static(browserDistFolder, {
|
|
maxAge: '1y',
|
|
index: 'index.html',
|
|
redirect: false
|
|
})
|
|
);
|
|
|
|
/**
|
|
* Handle all other requests by rendering the Angular application.
|
|
*/
|
|
app.get('**', (request, response, next) => {
|
|
const {
|
|
protocol,
|
|
originalUrl,
|
|
baseUrl,
|
|
headers
|
|
} = request;
|
|
|
|
commonEngine
|
|
.render({
|
|
bootstrap,
|
|
documentFilePath: indexHtml,
|
|
url: `${protocol}://${headers.host}${originalUrl}`,
|
|
publicPath: browserDistFolder,
|
|
providers: [{ provide: APP_BASE_HREF, useValue: baseUrl }]
|
|
})
|
|
.then((html) => response.send(html))
|
|
.catch((error) => next(error));
|
|
});
|
|
|
|
/**
|
|
* Start the server if this module is the main entry point.
|
|
*/
|
|
if (isMainModule(import.meta.url)) {
|
|
const port = process.env['PORT'] || 4000;
|
|
|
|
app.listen(port, () => {
|
|
console.log(`Node Express server listening on http://localhost:${port}`);
|
|
});
|
|
}
|
|
|
|
export default app;
|