walnut.js/lib/local-server.js

59 lines
1.7 KiB
JavaScript
Raw Normal View History

2015-11-06 01:00:22 +00:00
'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)
2016-03-29 19:03:09 +00:00
module.exports.create = function (lex, certPaths, port, info, serverCallback) {
function initServer(err, server) {
var app;
var promiseApp;
2015-11-06 01:00:22 +00:00
if (err) {
serverCallback(err);
return;
}
2015-11-06 01:00:22 +00:00
server.on('error', serverCallback);
2015-11-14 04:25:12 +00:00
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);
2015-11-06 01:00:22 +00:00
});
2015-11-14 04:25:12 +00:00
/*
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);
});
*/
2015-11-06 01:00:22 +00:00
// Get up and listening as absolutely quickly as possible
2016-03-29 19:03:09 +00:00
function onRequest(req, res) {
// this is a hot piece of code, so we cache the result
if (app) {
app(req, res);
return;
2015-11-06 01:00:22 +00:00
}
promiseApp.then(function (_app) {
2015-11-14 04:25:12 +00:00
console.log('[Server]', req.method, req.host || req.headers['x-forwarded-host'] || req.headers.host, req.url);
app = _app;
2015-11-06 01:00:22 +00:00
app(req, res);
});
2016-03-29 19:03:09 +00:00
}
if (lex) {
2017-05-01 21:39:43 +00:00
server.on('request', lex.middleware(onRequest));
2016-03-29 19:03:09 +00:00
} else {
server.on('request', onRequest);
}
}
if (certPaths) {
2016-03-29 19:03:09 +00:00
require('./sni-server').create(lex, certPaths, initServer);
} else {
initServer(null, require('http').createServer());
}
2015-11-06 01:00:22 +00:00
};