UNPKG

actionhero

Version:

The reusable, scalable, and quick node.js API server for stateless and stateful applications

101 lines (100 loc) 4.57 kB
"use strict"; 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;