From 4af6fa790154089ec266c6f57fbb53c72da7000a Mon Sep 17 00:00:00 2001 From: Lloyd Brookes Date: Wed, 4 May 2016 12:17:44 +0100 Subject: [PATCH] refactor to avoid node v6 issue where the process ends before process.stdout is flushed --- README.md | 2 +- bin/cli.js | 124 ++++++++++++++++++++---------------- example/mock-async/mocks/delayed.js | 2 +- 3 files changed, 71 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index 9b89ab3..14e8e6b 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,7 @@ For the examples below, we assume we're in a project directory looking like this └── package.json ``` -All paths/routes are specified using [express syntax](http://expressjs.com/guide/routing.html#route-paths). To run the example projects linked below, clone the project, move into the example directory specified, run `ws`. +**All paths/routes are specified using [express syntax](http://expressjs.com/guide/routing.html#route-paths)**. To run the example projects linked below, clone the project, move into the example directory specified, run `ws`. ### Static site diff --git a/bin/cli.js b/bin/cli.js index bb60489..8de7ca6 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -14,65 +14,79 @@ const flatten = require('reduce-flatten') const cli = commandLineArgs(cliOptions.definitions) const usage = cli.getUsage(cliOptions.usageData) const stored = loadConfig('local-web-server') -const options = collectOptions() +let options +let isHttps = false -if (options.misc.help) stop(usage, 0) -if (options.misc.config) stop(JSON.stringify(options.server, null, ' '), 0) +try { + options = collectOptions() +} catch (err) { + stop([ `[red]{Error}: ${err.message}`, usage ], 1) + return +} -validateOptions(options) +if (options.misc.help) { + stop(usage, 0) +} else if (options.misc.config) { + stop(JSON.stringify(options.server, null, ' '), 0) +} else { + const valid = validateOptions(options) + if (!valid) { + /* gracefully end the process */ + return + } -const app = localWebServer({ - static: { - root: options.server.directory, - options: { - hidden: true - } - }, - serveIndex: { - path: options.server.directory, - options: { - icons: true, - hidden: true - } - }, - log: { - format: options.server['log-format'] - }, - compress: options.server.compress, - mime: options.server.mime, - forbid: options.server.forbid, - spa: options.server.spa, - 'no-cache': options.server['no-cache'], - rewrite: options.server.rewrite, - verbose: options.server.verbose, - mocks: options.server.mocks -}) - -if (options.server.https) { - options.server.key = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.key') - options.server.cert = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.crt') -} + const app = localWebServer({ + static: { + root: options.server.directory, + options: { + hidden: true + } + }, + serveIndex: { + path: options.server.directory, + options: { + icons: true, + hidden: true + } + }, + log: { + format: options.server['log-format'] + }, + compress: options.server.compress, + mime: options.server.mime, + forbid: options.server.forbid, + spa: options.server.spa, + 'no-cache': options.server['no-cache'], + rewrite: options.server.rewrite, + verbose: options.server.verbose, + mocks: options.server.mocks + }) -let isHttps = false -if (options.server.key && options.server.cert) { - const https = require('https') - const fs = require('fs') - isHttps = true - - const serverOptions = { - key: fs.readFileSync(options.server.key), - cert: fs.readFileSync(options.server.cert) + if (options.server.https) { + options.server.key = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.key') + options.server.cert = path.resolve(__dirname, '..', 'ssl', '127.0.0.1.crt') } - const server = https.createServer(serverOptions, app.callback()) - server.listen(options.server.port, onServerUp) -} else { - app.listen(options.server.port, onServerUp) + if (options.server.key && options.server.cert) { + const https = require('https') + const fs = require('fs') + isHttps = true + + const serverOptions = { + key: fs.readFileSync(options.server.key), + cert: fs.readFileSync(options.server.cert) + } + + const server = https.createServer(serverOptions, app.callback()) + server.listen(options.server.port, onServerUp) + } else { + app.listen(options.server.port, onServerUp) + } } function stop (msgs, exitCode) { arrayify(msgs).forEach(msg => console.error(ansi.format(msg))) - process.exit(exitCode) + process.exitCode = exitCode } function onServerUp () { @@ -96,11 +110,7 @@ function collectOptions () { let options = {} /* parse command line args */ - try { - options = cli.parse() - } catch (err) { - stop([ `[red]{Error}: ${err.message}`, usage ], 1) - } + options = cli.parse() const builtIn = { port: 8000, @@ -129,10 +139,14 @@ function parseRewriteRules (rules) { } function validateOptions (options) { + let valid = true function invalid (msg) { return `[red underline]{Invalid:} [bold]{${msg}}` } + if (!t.isNumber(options.server.port)) { - stop([ invalid(`--port must be numeric [value=${options.server.port}]`), usage ], 1) + stop([ invalid(`--port must be numeric`), usage ], 1) + valid = false } + return valid } diff --git a/example/mock-async/mocks/delayed.js b/example/mock-async/mocks/delayed.js index 6e7f4c0..0b08823 100644 --- a/example/mock-async/mocks/delayed.js +++ b/example/mock-async/mocks/delayed.js @@ -2,7 +2,7 @@ module.exports = { response: function (ctx) { return new Promise((resolve, reject) => { setTimeout(() => { - ctx.body = `

You waited 2s for this

` + ctx.body = '

You waited 2s for this

' resolve() }, 2000) })