'use strict'; // Note the odd use of callbacks (instead of promises) here // It's to avoid loading bluebird yet (see sni-server.js for explanation) module.exports.create = function (certPaths, port, serverCallback) { function initServer(err, server) { var app; var promiseApp; if (err) { serverCallback(err); return; } server.on('error', serverCallback); server.listen(port, '0.0.0.0', function () { // is it even theoritically possible for // a request to come in before this callback has fired? // I'm assuming this event must fire before any request event promiseApp = serverCallback(null, server); }); /* server.listen(port, '::::', function () { // is it even theoritically possible for // a request to come in before this callback has fired? // I'm assuming this event must fire before any request event promiseApp = serverCallback(null, server); }); */ // Get up and listening as absolutely quickly as possible server.on('request', function (req, res) { // this is a hot piece of code, so we cache the result if (app) { app(req, res); return; } promiseApp.then(function (_app) { console.log('[Server]', req.method, req.host || req.headers['x-forwarded-host'] || req.headers.host, req.url); app = _app; app(req, res); }); }); } if (certPaths) { require('./sni-server').create(certPaths, port, initServer); } else { initServer(null, require('http').createServer()); } };