@sitecore-jss/sitecore-jss-rendering-host
Version:
This module is provided as a part of Sitecore JavaScript Rendering SDK (JSS). It contains the rendering host implementation.
85 lines (84 loc) • 4.01 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.startRenderingHostServer = startRenderingHostServer;
const compression_1 = __importDefault(require("compression"));
const express_1 = __importDefault(require("express"));
// import importFresh from 'import-fresh';
// import path from 'path';
const ssrMiddleware_1 = require("./ssrMiddleware");
const defaultAppInvocationInfoResolver_1 = require("./defaultAppInvocationInfoResolver");
/**
* @param {RenderingHostServerOptions} config
*/
function startRenderingHostServer({ port = 0, hostname = 'localhost', hooks = {}, middlewares = {}, enableCompression = true, ssrMiddleware, ssrMiddlewarePath, appInvocationInfoResolver: customAppInvocationInfoResolver, }) {
const server = (0, express_1.default)();
if (enableCompression) {
const compressionMiddleware = middlewares.compression && typeof middlewares.compression === 'function'
? middlewares.compression
: (0, compression_1.default)();
server.use(compressionMiddleware);
}
const appInvocationInfoResolver = customAppInvocationInfoResolver || (0, defaultAppInvocationInfoResolver_1.getDefaultAppInvocationInfoResolver)({});
const middleware = ssrMiddleware
? ssrMiddleware({
appInvocationInfoResolver,
})
: (0, ssrMiddleware_1.ssrMiddleware)({
appInvocationInfoResolver,
});
// Give devs a chance to add custom middleware before the SSR middleware is registered.
invokeHook(hooks.beforeSSRMiddlewareRegistered, server);
// Otherwise, by default we assume all POST requests should be handled by the SSR middleware.
server.post(ssrMiddlewarePath || '*', middleware);
invokeHook(hooks.beforeStaticFileMiddlewareRegistered, server);
// TODO: register static asset middleware
// Give devs a chance to add more middleware or whatever prior to starting the server.
invokeHook(hooks.beforeServerStarted, server);
// Start the webpack dev server
server.listen(port, hostname, (err) => {
if (err) {
console.error(err);
return;
}
console.log(`Starting rendering host at ${hostname}:${port}`);
invokeHook(hooks.afterServerStarted, server);
});
}
/**
* @param {Function | undefined} hook
* @param {...unknown} args
*/
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
function invokeHook(hook, ...args) {
if (hook && typeof hook === 'function') {
hook(...args);
}
}
// function getDefaultAppInvocationInfoResolver(baseAppPath: string = './dist') {
// const resolver: AppInvocationInfoResolver = (bodyJson: any) => {
// // default resolution assumes folder structure of:
// // ./dist/{JSSAppName}/{ServerBundleName}.js
// const modulePath = path.resolve(baseAppPath, bodyJson.id, bodyJson.moduleName);
// const resolvedModule = importFresh(modulePath);
// const resolvedRenderFunctionName = bodyJson.functionName || 'renderView';
// const renderFunction = resolvedModule[resolvedRenderFunctionName];
// if (!renderFunction) {
// throw new Error(`The module "${modulePath}" has no export named "${resolvedRenderFunctionName}".
// Ensure that your server bundle is transpiled to CommonJS (or equivalent) format that can be
// resolved by Node.js 'require' statement. And ensure that your server entry point exports a function
// named "${resolvedRenderFunctionName}".`);
// }
// const renderFunctionArgs = bodyJson.args;
// return {
// renderFunction: (...args) => {
// console.log(`[SSR] rendering app at ${modulePath} via render function named ${resolvedRenderFunctionName}`);
// return renderFunction(...args);
// },
// renderFunctionArgs,
// };
// };
// return resolver;
// }