UNPKG

@hyperledger/cactus-common

Version:

Universal library used by both front end and back end components of Cactus. Aims to be a developer swiss army knife.

94 lines 7.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Servers = void 0; const http_1 = require("http"); const checks_1 = require("./checks"); /** * Utility class for handling common tasks for NodeJS HTTP/S server objects. */ class Servers { /** * Returns with a promise that resolves when the server has been shut down. Rejects if anything goes wrong of if the * parameters are invalid. * * @param server The server object that will be shut down. */ static async shutdown(server) { const fnTag = `Servers#shutdown()`; if (!server) { throw new TypeError(`${fnTag} server was falsy. Need object.`); } return new Promise((resolve, reject) => { server.close((err) => { if (err) { reject(new Error(`${fnTag} Failed to shut down server ${err.stack}`)); } else { resolve(); } }); }); } static async listen(options) { const fnTag = "Servers#listen()"; checks_1.Checks.truthy(options, `${fnTag} arg options`); checks_1.Checks.truthy(options.server, `${fnTag} arg options.server`); checks_1.Checks.truthy(options.port || options.port === 0, `${fnTag} arg options.port`); checks_1.Checks.truthy(typeof options.port === "number", `${fnTag} arg options.port is number`); checks_1.Checks.truthy(isFinite(options.port), `${fnTag} arg finite options.port`); checks_1.Checks.truthy(options.port > -1, `${fnTag} arg positive options.port`); checks_1.Checks.truthy(options.hostname, `${fnTag} arg options.hostname`); const { server, port, hostname } = options; return new Promise((resolve, reject) => { server.on("error", (ex) => reject(ex)); const listenOptions = { host: hostname, port, }; // called when the `listening` event is fired const onListeningHandler = () => { const addressInfo = options.server.address(); resolve(addressInfo); }; server.listen(listenOptions, onListeningHandler); }); } /** * Start an HTTP server on the preferred port provided in the parameter if * possible, bind to a random (0) port otherwise. * * @param preferredPort The TCP port the caller would **prefer** to use if * possible. If the preferred port is taken, it will bind the server to port * zero instead which means that the operating system will randomly choose an * available port and use that. */ static async startOnPreferredPort(preferredPort, host = "127.0.0.1") { if (preferredPort) { try { const server = await Servers.startOnPort(preferredPort, host); return server; } catch (ex) { // if something else went wrong we still want to just give up if (!ex.message.includes("EADDRINUSE")) { throw ex; } } return Servers.startOnPort(0); } else { return Servers.startOnPort(0); } } static async startOnPort(port, host = "127.0.0.1") { const server = await new Promise((resolve, reject) => { const aServer = (0, http_1.createServer)(); aServer.once("listening", () => resolve(aServer)); aServer.once("error", (err) => reject(err)); aServer.listen(port, host); }); return server; } } exports.Servers = Servers; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL3R5cGVzY3JpcHQvc2VydmVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwrQkFBNEM7QUFFNUMscUNBQWtDO0FBUWxDOztHQUVHO0FBQ0gsTUFBYSxPQUFPO0lBQ2xCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBNkI7UUFDeEQsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUM7UUFDbkMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osTUFBTSxJQUFJLFNBQVMsQ0FBQyxHQUFHLEtBQUssaUNBQWlDLENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUMzQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBc0IsRUFBRSxFQUFFO2dCQUN0QyxJQUFJLEdBQUcsRUFBRSxDQUFDO29CQUNSLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssK0JBQStCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixPQUFPLEVBQUUsQ0FBQztnQkFDWixDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUF1QjtRQUNoRCxNQUFNLEtBQUssR0FBRyxrQkFBa0IsQ0FBQztRQUVqQyxlQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxHQUFHLEtBQUssY0FBYyxDQUFDLENBQUM7UUFDL0MsZUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzdELGVB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