Files
2022-12-27 12:05:56 +01:00

154 lines
5.2 KiB
JavaScript

import "./node-polyfill-fetch";
import * as log from "../build/output/log";
import loadConfig from "./config";
import { resolve } from "path";
import { NON_STANDARD_NODE_ENV } from "../lib/constants";
import { PHASE_DEVELOPMENT_SERVER } from "../shared/lib/constants";
import { PHASE_PRODUCTION_SERVER } from "../shared/lib/constants";
import { loadRequireHook, overrideBuiltInReactPackages } from "../build/webpack/require-hook";
loadRequireHook();
let ServerImpl;
const getServerImpl = async ()=>{
if (ServerImpl === undefined) {
ServerImpl = (await Promise.resolve(require("./next-server"))).default;
}
return ServerImpl;
};
export class NextServer {
constructor(options){
this.options = options;
}
get hostname() {
return this.options.hostname;
}
get port() {
return this.options.port;
}
getRequestHandler() {
return async (req, res, parsedUrl)=>{
const requestHandler = await this.getServerRequestHandler();
return requestHandler(req, res, parsedUrl);
};
}
getUpgradeHandler() {
return async (req, socket, head)=>{
const server = await this.getServer();
// @ts-expect-error we mark this as protected so it
// causes an error here
return server.handleUpgrade.apply(server, [
req,
socket,
head
]);
};
}
setAssetPrefix(assetPrefix) {
if (this.server) {
this.server.setAssetPrefix(assetPrefix);
} else {
this.preparedAssetPrefix = assetPrefix;
}
}
logError(...args) {
if (this.server) {
this.server.logError(...args);
}
}
async render(...args) {
const server = await this.getServer();
return server.render(...args);
}
async renderToHTML(...args) {
const server = await this.getServer();
return server.renderToHTML(...args);
}
async renderError(...args) {
const server = await this.getServer();
return server.renderError(...args);
}
async renderErrorToHTML(...args) {
const server = await this.getServer();
return server.renderErrorToHTML(...args);
}
async render404(...args) {
const server = await this.getServer();
return server.render404(...args);
}
async serveStatic(...args) {
const server = await this.getServer();
return server.serveStatic(...args);
}
async prepare() {
const server = await this.getServer();
return server.prepare();
}
async close() {
const server = await this.getServer();
return server.close();
}
async createServer(options) {
if (options.dev) {
const DevServer = require("./dev/next-dev-server").default;
return new DevServer(options);
}
const ServerImplementation = await getServerImpl();
return new ServerImplementation(options);
}
async loadConfig() {
return loadConfig(this.options.dev ? PHASE_DEVELOPMENT_SERVER : PHASE_PRODUCTION_SERVER, resolve(this.options.dir || "."), this.options.conf);
}
async getServer() {
if (!this.serverPromise) {
this.serverPromise = this.loadConfig().then(async (conf)=>{
if (conf.experimental.appDir) {
process.env.NEXT_PREBUNDLED_REACT = "1";
overrideBuiltInReactPackages();
}
this.server = await this.createServer({
...this.options,
conf
});
if (this.preparedAssetPrefix) {
this.server.setAssetPrefix(this.preparedAssetPrefix);
}
return this.server;
});
}
return this.serverPromise;
}
async getServerRequestHandler() {
// Memoize request handler creation
if (!this.reqHandlerPromise) {
this.reqHandlerPromise = this.getServer().then((server)=>server.getRequestHandler().bind(server));
}
return this.reqHandlerPromise;
}
}
// This file is used for when users run `require('next')`
function createServer(options) {
// The package is used as a TypeScript plugin.
if (options && "typescript" in options && "version" in options.typescript) {
return require("./next-typescript").createTSPlugin(options);
}
if (options == null) {
throw new Error("The server has not been instantiated properly. https://nextjs.org/docs/messages/invalid-server-options");
}
if (!("isNextDevCommand" in options) && process.env.NODE_ENV && ![
"production",
"development",
"test"
].includes(process.env.NODE_ENV)) {
log.warn(NON_STANDARD_NODE_ENV);
}
if (options.dev && typeof options.dev !== "boolean") {
console.warn("Warning: 'dev' is not a boolean which could introduce unexpected behavior. https://nextjs.org/docs/messages/invalid-server-options");
}
return new NextServer(options);
}
// Support commonjs `require('next')`
module.exports = createServer;
exports = module.exports;
// Support `import next from 'next'`
export default createServer;
//# sourceMappingURL=next.js.map