@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
JavaScript
;
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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