blob: 30d4fc58e6e4c938083e4332e95777e6c0c5df1b [file] [log] [blame]
/* eslint-disable no-process-env */
/* eslint-disable no-sync */
var https = require('https');
var fs = require('fs');
var core = require('union/lib/core');
var RoutingStream = require('union/lib/routing-stream');
module.exports = function (options) {
var isArray = Array.isArray(options.after);
var credentials;
if (!options) {
throw new Error('options is required to create a server');
}
function requestHandler(req, res) {
var routingStream = new RoutingStream({
before: options.before,
buffer: options.buffer,
after:
isArray &&
options.after.map(function (After) {
return new After();
}),
request: req,
response: res,
limit: options.limit,
headers: options.headers
});
routingStream.on('error', function (err) {
var fn = options.onError || core.errorHandler;
fn(err, routingStream, routingStream.target, function () {
routingStream.target.emit('next');
});
});
req.pipe(routingStream);
}
var serverOptions;
serverOptions = options.https;
if (!serverOptions.key || !serverOptions.cert) {
throw new Error(
'Both options key and cert are required.'
);
}
credentials = {
key: fs.readFileSync(serverOptions.key),
cert: fs.readFileSync(serverOptions.cert),
passphrase: process.env.NODE_HTTP_SERVER_SSL_PASSPHRASE
};
if (serverOptions.ca) {
serverOptions.ca = !Array.isArray(serverOptions.ca)
? [serverOptions.ca]
: serverOptions.ca;
credentials.ca = serverOptions.ca.map(function (ca) {
return fs.readFileSync(ca);
});
}
return https.createServer(credentials, requestHandler);
};