@paroicms/server
Version:
The ParoiCMS server
119 lines • 5.49 kB
JavaScript
import { eachDay, makeUrl, startCronLike } from "@paroicms/internal-server-lib";
import { setupImageProcessor } from "@paroicms/server-image-cache-engine";
import compression from "compression";
import cookieParser from "cookie-parser";
import express from "express";
import rateLimit from "express-rate-limit";
import { createRegisteredSitesFromSingle, loadRegisteredSitesFromPacks, } from "./connector/site-conf/site-conf.js";
import { readCommonSchemaLibrary } from "./connector/site-schema/common-schema-reader.js";
import { appConf, appPackage, cmsVersion, initCommonSchemaLib, initializeContext, platformAuthUrl, platformLogger, registeredSites, setAppPackage, } from "./context.js";
import { httpRedirectionMiddleware } from "./express/http-redirection-middleware.js";
import { loadPaSiteContextMiddleware, reqHandlerToExpressMiddleware, } from "./express/route-handler-wrapper.js";
import { createAdminUiGraphqlMiddleware, createMinimalSiteMiddleware, createRenderedSiteMiddleware, } from "./express/site-middleware.js";
import { createCorsMiddleware } from "./helpers/cors-middleware.js";
import { maintenanceTask, unloadAllActiveSites } from "./maintenance/maintenance-task.js";
import { handleShutdownEvents } from "./maintenance/shutdown.js";
import { createOauth2ClientMiddleware } from "./oauth/oauth-middleware.js";
import { tailReqHandler } from "./rendered-site/serve-index-page.js";
import { watchForIdleSiteContexts } from "./site-context/site-context.js";
if (process.env.NODE_ENV === "development") {
(await import("source-map-support")).default.install();
}
export async function start(options = {}) {
try {
if (options.appVersion) {
platformLogger.warn("StartOptions.appVersion is deprecated; use appPackage instead.");
if (!options.appPackage) {
setAppPackage({ name: "unamed", version: options.appVersion });
}
}
else if (options.appPackage) {
setAppPackage(options.appPackage);
}
await platformLogger.untilReady;
const appPackageLabel = appPackage
? `${appPackage.name}@${appPackage.version}`
: "(no-package)";
platformLogger.info(`Starting ${appConf.kind} ParoiCMS ${cmsVersion}, application ${appPackageLabel}…`);
watchForIdleSiteContexts();
setupImageProcessor({ ...appConf.imageProcessor, logger: platformLogger });
const regSites = appConf.kind === "multisite"
? await loadRegisteredSitesFromPacks(appConf, options.sitePackPlaces)
: await createRegisteredSitesFromSingle(appConf);
await initializeContext(regSites);
initCommonSchemaLib(await readCommonSchemaLibrary());
const stopCron = startCronLike(maintenanceTask, {
shouldExecute: eachDay({ hours: 2 }),
logger: platformLogger,
});
const expressApp = express();
expressApp.use(express.json({ limit: "50mb" }));
expressApp.use(cookieParser());
expressApp.use(rateLimit({
windowMs: 2_000,
limit: 200,
standardHeaders: true,
legacyHeaders: false,
}));
expressApp.use(createCorsMiddleware());
expressApp.use(httpRedirectionMiddleware);
if (platformAuthUrl && appConf.googleAuth) {
expressApp.use(await createOauth2ClientMiddleware(appConf.googleAuth.fqdn));
}
if (process.env.NODE_ENV === "development") {
const { localTestingRoute } = await import("./express/local-testing-route.js");
expressApp.post("/local-testing", localTestingRoute);
}
expressApp.use(loadPaSiteContextMiddleware);
expressApp.use("/adm/backend/graphql", await createAdminUiGraphqlMiddleware());
expressApp.use(compression());
expressApp.use(createMinimalSiteMiddleware());
expressApp.use(createRenderedSiteMiddleware());
expressApp.use(reqHandlerToExpressMiddleware(tailReqHandler));
let httpServer;
if (appConf.hostname) {
httpServer = expressApp.listen(appConf.port, appConf.hostname);
}
else {
httpServer = expressApp.listen(appConf.port);
}
handleShutdownEvents({
logger: platformLogger,
closingTasks: [stopCron, unloadAllActiveSites, () => shutdownServer(httpServer)],
});
platformLogger.info(`ParoiCMS is up and running on port '${appConf.port}', it serves:${getListOfSiteUrls()
.map(({ siteUrl, adminUiUrl }) => `\n- ${siteUrl}${adminUiUrl ? ` - admin: ${adminUiUrl}` : ""}`)
.join("")}`);
}
catch (error) {
platformLogger.error(error);
}
}
function getListOfSiteUrls() {
return Array.from(registeredSites.values())
.map((regSite) => {
return {
siteUrl: regSite.siteUrl,
adminUiUrl: makeUrl({
protocol: appConf.publicProtocol,
port: appConf.adminUiPort,
fqdn: regSite.fqdn,
path: "/adm",
}),
};
})
.sort((a, b) => a.siteUrl.localeCompare(b.siteUrl));
}
function shutdownServer(server) {
return new Promise((resolve, reject) => {
server.close((error) => {
if (error) {
reject(error);
}
else {
resolve();
}
});
});
}
//# sourceMappingURL=index.js.map