actionhero
Version:
The reusable, scalable, and quick node.js API server for stateless and stateful applications
101 lines (100 loc) • 4.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Servers = void 0;
const path = require("path");
const index_1 = require("../index");
const safeGlob_1 = require("../modules/utils/safeGlob");
/**
* Manages the servers in this Actionhero instance.
*/
class Servers extends index_1.Initializer {
constructor() {
super();
this.name = "servers";
this.loadPriority = 599;
this.startPriority = 900;
this.stopPriority = 100;
}
async initialize() {
index_1.api.servers = {
servers: {},
};
const serverFolders = [path.resolve(path.join(__dirname, "..", "servers"))];
index_1.config.general.paths.server.forEach((p) => {
p = path.resolve(p);
if (serverFolders.indexOf(p) < 0) {
serverFolders.push(p);
}
});
let files = [];
for (const i in serverFolders) {
const p = serverFolders[i];
files = files.concat((0, safeGlob_1.safeGlobSync)(path.join(p, "**", "**/*(*.js|*.ts)")));
}
for (const [_, plugin] of Object.entries(index_1.config.plugins)) {
if (plugin.servers !== false) {
const pluginPath = path.normalize(plugin.path);
// old style at the root of the project
files = files.concat((0, safeGlob_1.safeGlobSync)(path.join(pluginPath, "servers", "**", "*.js")));
files = files.concat((0, safeGlob_1.safeGlobSync)(path.join(pluginPath, "dist", "servers", "**", "*.js")));
}
}
files = index_1.utils.ensureNoTsHeaderOrSpecFiles(files);
let server;
for (const j in files) {
const filename = files[j];
const ExportedClasses = await Promise.resolve(`${filename}`).then(s => require(s));
const exportLen = Object.keys(ExportedClasses).length;
// we have named exports
if (exportLen) {
if (exportLen > 1) {
throw new Error(`server file ${filename} exports more than one server`);
}
server = new ExportedClasses[Object.keys(ExportedClasses)[0]]();
}
else {
// there is one default export
server = new ExportedClasses();
}
server.config = index_1.config[server.type]; // for shorthand access
if (server.config && server.config.enabled === true) {
await server.initialize();
if (index_1.api.servers.servers[server.type]) {
(0, index_1.log)(`an existing server with the same type \`${server.type}\` will be overridden by the file ${filename}`, "crit");
}
index_1.api.servers.servers[server.type] = server;
(0, index_1.log)(`Initialized server: ${server.type}`, "debug");
}
}
}
async start() {
var _a, _b, _c, _d;
for (const serverName of Object.keys(index_1.api.servers.servers)) {
const bindIp = (_b = (_a = index_1.config[serverName]) === null || _a === void 0 ? void 0 : _a.bindIP) === null || _b === void 0 ? void 0 : _b.toString();
const port = (_d = (_c = index_1.config[serverName]) === null || _c === void 0 ? void 0 : _c.port) === null || _d === void 0 ? void 0 : _d.toString();
const server = index_1.api.servers.servers[serverName];
if (server && server.config.enabled === true) {
const message = `Starting server: \`${serverName}\` ${bindIp
? `@ ${serverName === "web" ? "http://" : ""}${bindIp}${port ? `:${port}` : ""}`
: ""}`;
(0, index_1.log)(message, "notice");
await server.start();
(0, index_1.log)(`Server started: ${serverName}`, "debug");
}
}
}
async stop() {
const serverNames = Object.keys(index_1.api.servers.servers);
for (const i in serverNames) {
const serverName = serverNames[i];
const server = index_1.api.servers.servers[serverName];
if ((server && server.config.enabled === true) || !server) {
(0, index_1.log)(`Stopping server: ${serverName}`, "notice");
await server.stop();
server.removeAllListeners();
(0, index_1.log)(`Server stopped: ${serverName}`, "debug");
}
}
}
}
exports.Servers = Servers;