mirror of
https://github.com/Lissy93/web-check.git
synced 2025-02-16 10:29:46 +01:00
feat: Dynamically import SSR handler
This commit is contained in:
parent
8c17303179
commit
a6bc8d790e
47
server.js
47
server.js
@ -7,8 +7,6 @@ import express from 'express';
|
|||||||
import rateLimit from 'express-rate-limit';
|
import rateLimit from 'express-rate-limit';
|
||||||
import historyApiFallback from 'connect-history-api-fallback';
|
import historyApiFallback from 'connect-history-api-fallback';
|
||||||
|
|
||||||
import { handler as ssrHandler } from './dist/server/entry.mjs';
|
|
||||||
|
|
||||||
// Load environment variables from .env file
|
// Load environment variables from .env file
|
||||||
dotenv.config();
|
dotenv.config();
|
||||||
|
|
||||||
@ -80,17 +78,33 @@ fs.readdirSync(dirPath, { withFileTypes: true })
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const renderPlaceholderPage = async (res, msgId, logs) => {
|
||||||
|
const errorMessages = {
|
||||||
|
notCompiled: 'Looks like the GUI app has not yet been compiled.<br />'
|
||||||
|
+ 'Run <code>yarn build</code> to continue, then restart the server.',
|
||||||
|
notCompiledSsrHandler: 'Server-side rendering failed to initiate, as SSR handler not found.<br />'
|
||||||
|
+ 'This can be fixed by running <code>yarn build</code>, then restarting the server.<br />',
|
||||||
|
disabledGui: 'Web-Check API is up and running!<br />Access the endpoints at '
|
||||||
|
+ `<a href="${API_DIR}"><code>${API_DIR}</code></a>`,
|
||||||
|
};
|
||||||
|
const logOutput = logs ? `<div class="logs"><code>${logs}</code></div>` : '';
|
||||||
|
const errorMessage = (errorMessages[msgId] || 'An mystery error occurred.') + logOutput;
|
||||||
|
const placeholderContent = await fs.promises.readFile(placeholderFilePath, 'utf-8');
|
||||||
|
const htmlContent = placeholderContent.replace('<!-- CONTENT -->', errorMessage );
|
||||||
|
res.status(500).send(htmlContent);
|
||||||
|
};
|
||||||
|
|
||||||
// Create a single API endpoint to execute all lambda functions
|
// Create a single API endpoint to execute all lambda functions
|
||||||
app.get(API_DIR, async (req, res) => {
|
app.get(API_DIR, 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) => {
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
try {
|
try {
|
||||||
const mockRes = {
|
const mockRes = {
|
||||||
status: (statusCode) => mockRes,
|
status: () => mockRes,
|
||||||
json: (body) => resolve({ body }),
|
json: (body) => resolve({ body }),
|
||||||
};
|
};
|
||||||
await handler({ ...req, query: { url } }, mockRes);
|
await handler({ ...req, query: { url } }, mockRes);
|
||||||
@ -139,28 +153,21 @@ app.use((req, res, 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) => {
|
||||||
const placeholderContent = await fs.promises.readFile(placeholderFilePath, 'utf-8');
|
renderPlaceholderPage(res, 'disabledGui');
|
||||||
const htmlContent = placeholderContent.replace(
|
|
||||||
'<!-- CONTENT -->',
|
|
||||||
'Web-Check API is up and running!<br />Access the endpoints at '
|
|
||||||
+`<a href="${API_DIR}"><code>${API_DIR}</code></a>`
|
|
||||||
);
|
|
||||||
res.status(500).send(htmlContent);
|
|
||||||
});
|
});
|
||||||
} else if (!fs.existsSync(guiPath)) {
|
} else if (!fs.existsSync(guiPath)) {
|
||||||
app.get('/', async (req, res) => {
|
app.get('/', async (req, res) => {
|
||||||
const placeholderContent = await fs.promises.readFile(placeholderFilePath, 'utf-8');
|
renderPlaceholderPage(res, 'notCompiled');
|
||||||
const htmlContent = placeholderContent.replace(
|
|
||||||
'<!-- CONTENT -->',
|
|
||||||
'Looks like the GUI app has not yet been compiled.<br /> ' +
|
|
||||||
'Run <code>yarn build</code> to continue, then restart the server.'
|
|
||||||
);
|
|
||||||
res.status(500).send(htmlContent);
|
|
||||||
});
|
});
|
||||||
} else { // GUI enabled, and build files present, let's go!!
|
} else { // GUI enabled, and build files present, let's go!!
|
||||||
app.use(express.static('dist/client/'));
|
app.use(express.static('dist/client/'));
|
||||||
app.use((req, res, next) => {
|
app.use(async (req, res, next) => {
|
||||||
ssrHandler(req, res, next);
|
const ssrHandlerPath = path.join(__dirname, 'dist', 'server', 'entry.mjs');
|
||||||
|
import(ssrHandlerPath).then(({ handler: ssrHandler }) => {
|
||||||
|
ssrHandler(req, res, next);
|
||||||
|
}).catch(async err => {
|
||||||
|
renderPlaceholderPage(res, 'notCompiledSsrHandler', err.message);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user