egg
Version:
A web application framework for Node.js
53 lines (52 loc) • 1.75 kB
JavaScript
import { Agent } from "./agent.js";
import { Application } from "./application.js";
import "./types.js";
import { ManifestStore } from "@eggjs/core";
import path from "node:path";
import { importModule } from "@eggjs/utils";
import { readJSON } from "utility";
//#region src/lib/start.ts
async function resolveFrameworkClasses(options) {
if (!options.framework) try {
options.framework = (await readJSON(path.join(options.baseDir, "package.json"))).egg.framework;
} catch {}
let AgentClass = Agent;
let ApplicationClass = Application;
if (options.framework) {
const framework = await importModule(options.framework, { paths: [options.baseDir] });
AgentClass = framework.Agent;
ApplicationClass = framework.Application;
}
return {
AgentClass,
ApplicationClass
};
}
/**
* Start egg with single process.
*
* When `options.snapshot` is true, loads application metadata for V8 startup
* snapshot construction. The lifecycle stops after `configWillLoad` (no servers,
* timers, or connections) and skips `egg-ready` broadcast.
*/
async function startEgg(options = {}) {
options.baseDir = options.baseDir ?? process.cwd();
options.mode = "single";
if (!options.snapshot) ManifestStore.enableCompileCache(options.baseDir);
const { AgentClass, ApplicationClass } = await resolveFrameworkClasses(options);
let agent;
if (!options.metadataOnly) {
agent = new AgentClass({ ...options });
await agent.ready();
}
const application = new ApplicationClass({ ...options });
if (agent) {
application.agent = agent;
agent.application = application;
}
await application.ready();
if (!options.metadataOnly && !options.snapshot) application.messenger.broadcast("egg-ready");
return application;
}
//#endregion
export { startEgg };