Send user direct to check page, if self-hosted

This commit is contained in:
Alicia Sykes 2024-05-06 23:29:30 +01:00
parent d9135883de
commit 42d6e0394f
3 changed files with 59 additions and 51 deletions

View File

@ -31,6 +31,9 @@ const site = unwrapEnvVar('SITE_URL', 'https://web-check.xyz');
// The base URL of the site (if serving from a subdirectory) // The base URL of the site (if serving from a subdirectory)
const base = unwrapEnvVar('BASE_URL', '/'); const base = unwrapEnvVar('BASE_URL', '/');
// Should run the app in boss-mode (requires extra configuration)
const isBossServer = unwrapEnvVar('BOSS_SERVER', false);
// Initialize Astro integrations // Initialize Astro integrations
const integrations = [react(), partytown(), sitemap()]; const integrations = [react(), partytown(), sitemap()];
@ -62,17 +65,13 @@ console.log(
`to help fund maintenance & development.\x1b[0m\n`, `to help fund maintenance & development.\x1b[0m\n`,
); );
const buildOptions = { const redirects = {};
output: 'dist',
format: 'esm',
};
// Skip the marketing homepage for self-hosted users
const redirects = { if (isBossServer && isBossServer === 'true') {
'/': '/test', redirects['/'] = '/check';
// '/results/[...target]': '/check/[...target]', // The old path was /results (redirect to maintain compatibility)
} }
// Export Astro configuration // Export Astro configuration
export default defineConfig({ output, base, integrations, site, adapter, redirects, buildOptions }); export default defineConfig({ output, base, integrations, site, adapter, redirects });

View File

@ -1,5 +1,6 @@
{ {
"name": "web-check", "name": "web-check",
"type": "module",
"version": "0.0.1", "version": "0.0.1",
"homepage": ".", "homepage": ".",
"scripts": { "scripts": {

View File

@ -79,54 +79,62 @@ fs.readdirSync(dirPath, { withFileTypes: true })
}); });
}); });
// Create a single API endpoint to execute all lambda functions // Create a single API endpoint to execute all lambda functions
app.get('/api', async (req, res) => { app.get('/api', async (req, res) => {
const results = {}; const results = {};
const { url } = req.query; const { url } = req.query;
const maxExecutionTime = process.env.API_TIMEOUT_LIMIT || 20000; const maxExecutionTime = process.env.API_TIMEOUT_LIMIT || 20000;
const executeHandler = async (handler, req, res) => { const executeHandler = async (handler, req, res) => {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
try {
const mockRes = {
status: (statusCode) => mockRes,
json: (body) => resolve({ body }),
};
await handler({ ...req, query: { url } }, mockRes);
} catch (err) {
reject(err);
}
});
};
const timeout = (ms, jobName = null) => {
return new Promise((_, reject) => {
setTimeout(() => {
reject(new Error(
`Timed out after ${ms/1000} seconds${jobName ? `, when executing ${jobName}` : ''}`
));
}, ms);
});
};
const handlerPromises = Object.entries(handlers).map(async ([route, handler]) => {
const routeName = route.replace(`${API_DIR}/`, '');
try { try {
const result = await Promise.race([ const mockRes = {
executeHandler(handler, req, res), status: (statusCode) => mockRes,
timeout(maxExecutionTime, routeName) json: (body) => resolve({ body }),
]); };
results[routeName] = result.body; await handler({ ...req, query: { url } }, mockRes);
} catch (err) { } catch (err) {
results[routeName] = { error: err.message }; reject(err);
} }
}); });
};
await Promise.all(handlerPromises);
res.json(results); const timeout = (ms, jobName = null) => {
return new Promise((_, reject) => {
setTimeout(() => {
reject(new Error(
`Timed out after ${ms/1000} seconds${jobName ? `, when executing ${jobName}` : ''}`
));
}, ms);
});
};
const handlerPromises = Object.entries(handlers).map(async ([route, handler]) => {
const routeName = route.replace(`${API_DIR}/`, '');
try {
const result = await Promise.race([
executeHandler(handler, req, res),
timeout(maxExecutionTime, routeName)
]);
results[routeName] = result.body;
} catch (err) {
results[routeName] = { error: err.message };
}
}); });
await Promise.all(handlerPromises);
res.json(results);
});
// Skip the marketing homepage, for self-hosted users
app.use((req, res, next) => {
if (req.path === '/' && process.env.BOSS_SERVER !== 'true') {
req.url = '/check';
}
next();
});
// Serve up the GUI - if build dir exists, and GUI feature enabled // Serve up the GUI - if build dir exists, and GUI feature enabled
if (process.env.DISABLE_GUI && process.env.DISABLE_GUI !== 'false') { if (process.env.DISABLE_GUI && process.env.DISABLE_GUI !== 'false') {
app.get('*', async (req, res) => { app.get('*', async (req, res) => {