@astrojs/node
Version:
Deploy your site to a Node.js server
51 lines (50 loc) • 1.67 kB
JavaScript
import { fileURLToPath } from "node:url";
import { AstroError } from "astro/errors";
import { logListeningOn } from "./log-listening-on.js";
import { createServer } from "./standalone.js";
const createPreviewServer = async (preview) => {
let ssrHandler;
try {
process.env.ASTRO_NODE_AUTOSTART = "disabled";
const ssrModule = await import(preview.serverEntrypoint.toString());
if (typeof ssrModule.handler === "function") {
ssrHandler = ssrModule.handler;
} else {
throw new AstroError(
`The server entrypoint doesn't have a handler. Are you sure this is the right file?`
);
}
} catch (err) {
if (err.code === "ERR_MODULE_NOT_FOUND" && err.url === preview.serverEntrypoint.href) {
throw new AstroError(
`The server entrypoint ${fileURLToPath(
preview.serverEntrypoint
)} does not exist. Have you ran a build yet?`
);
} else {
throw err;
}
}
const host = process.env.HOST ?? preview.host ?? "0.0.0.0";
const port = preview.port ?? 4321;
const server = createServer(ssrHandler, host, port);
if (preview.headers) {
server.server.addListener("request", (_, res) => {
if (res.statusCode === 200) {
for (const [name, value] of Object.entries(preview.headers ?? {})) {
if (value) res.setHeader(name, value);
}
}
});
}
logListeningOn(preview.logger, server.server, host);
await new Promise((resolve, reject) => {
server.server.once("listening", resolve);
server.server.once("error", reject);
server.server.listen(port, host);
});
return server;
};
export {
createPreviewServer as default
};