Skip to content

Instantly share code, notes, and snippets.

@krazylearner
Created April 25, 2015 09:46
Show Gist options
  • Save krazylearner/0175becd1db0daeed85b to your computer and use it in GitHub Desktop.
Save krazylearner/0175becd1db0daeed85b to your computer and use it in GitHub Desktop.
good implementation of server in nodejs
"use strict";
var http = require("http");
var https = require("https");
/**
* The default port that node servers bind to.
*/
var DEFAULT_PORT = 5000;
/**
* Creates and starts a node HTTP server that serves the given app.
*
* Options may be any of the following:
*
* - host The host name to accept connections on. Defaults to INADDR_ANY
* - port The port to listen on. Defaults to 5000
* - socket Unix socket file to listen on (trumps host/port)
* - quiet Set true to prevent the server from writing startup/shutdown
* messages to the console. Defaults to false
* - timeout The timeout to use when gracefully shutting down servers when
* SIGINT or SIGTERM are received. If a server doesn't close within
* this time (probably because it has open persistent connections)
* it is forecefully stopped when the process exits. Defaults to 100,
* meaning that servers forcefully shutdown after 100ms
* - key Private key to use for SSL (HTTPS only)
* - cert Public X509 certificate to use (HTTPS only)
*
* Note: When setting the timeout, be careful not to exceed any hard timeouts
* specified by your PaaS. For example, Heroku's dyno manager will not permit
* a timeout longer than ten seconds. See
* https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm
*
* Returns the node HTTP server instance.
*/
function serveApp(app, options) {
options = options || {};
if (typeof options === "number") {
options = { port: options };
} else if (typeof options === "string") {
options = { socket: options };
}
var nodeServer;
if (options.key && options.cert) {
nodeServer = https.createServer({ key: options.key, cert: options.cert });
} else {
nodeServer = http.createServer();
}
function shutdown() {
if (!options.quiet) console.log(">> Shutting down...");
// Force the process to exit if the server doesn't
// close all connections within the given timeout.
var timer = setTimeout(function () {
if (!options.quiet) console.log(">> Exiting");
process.exit(0);
}, options.timeout || 100);
// Don't let this timer keep the event loop running.
timer.unref();
nodeServer.close();
}
nodeServer.once("listening", function () {
bindApp(app, nodeServer);
process.once("SIGINT", shutdown);
process.once("SIGTERM", shutdown);
if (!options.quiet) {
var address = nodeServer.address();
var message = ">> mach web server started on node " + process.versions.node + "\n";
if (typeof address === "string") {
message += ">> Listening on " + address;
} else {
message += ">> Listening on " + address.address;
if (address.port) message += ":" + address.port;
}
message += ", use CTRL+C to stop";
console.log(message);
}
});
if (options.socket) {
nodeServer.listen(options.socket);
} else {
nodeServer.listen(options.port || DEFAULT_PORT, options.host);
}
return nodeServer;
}
function bindApp(app, nodeServer) {
var requestHandler = createRequestHandler(app);
nodeServer.on("request", requestHandler);
return requestHandler;
}
module.exports = serveApp;
@krazylearner
Copy link
Author

good implementation of server in nodejs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment