https-server-shim.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /* eslint-disable no-process-env */
  2. /* eslint-disable no-sync */
  3. var https = require('https');
  4. var fs = require('fs');
  5. var core = require('union/lib/core');
  6. var RoutingStream = require('union/lib/routing-stream');
  7. module.exports = function (options) {
  8. var isArray = Array.isArray(options.after);
  9. var credentials;
  10. if (!options) {
  11. throw new Error('options is required to create a server');
  12. }
  13. function requestHandler(req, res) {
  14. var routingStream = new RoutingStream({
  15. before: options.before,
  16. buffer: options.buffer,
  17. after:
  18. isArray &&
  19. options.after.map(function (After) {
  20. return new After();
  21. }),
  22. request: req,
  23. response: res,
  24. limit: options.limit,
  25. headers: options.headers
  26. });
  27. routingStream.on('error', function (err) {
  28. var fn = options.onError || core.errorHandler;
  29. fn(err, routingStream, routingStream.target, function () {
  30. routingStream.target.emit('next');
  31. });
  32. });
  33. req.pipe(routingStream);
  34. }
  35. var serverOptions;
  36. serverOptions = options.https;
  37. if (!serverOptions.key || !serverOptions.cert) {
  38. throw new Error(
  39. 'Both options key and cert are required.'
  40. );
  41. }
  42. credentials = {
  43. key: fs.readFileSync(serverOptions.key),
  44. cert: fs.readFileSync(serverOptions.cert),
  45. passphrase: process.env.NODE_HTTP_SERVER_SSL_PASSPHRASE
  46. };
  47. if (serverOptions.ca) {
  48. serverOptions.ca = !Array.isArray(serverOptions.ca)
  49. ? [serverOptions.ca]
  50. : serverOptions.ca;
  51. credentials.ca = serverOptions.ca.map(function (ca) {
  52. return fs.readFileSync(ca);
  53. });
  54. }
  55. return https.createServer(credentials, requestHandler);
  56. };