From bfaac061c851f10dfa9e8c8d625c482703b8da48 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 7 Jul 2015 19:51:49 -0600 Subject: [PATCH 1/3] Provide a debug loader for the library --- package.json | 3 +- tasks/.jshintrc | 1 + tasks/serve-lib.js | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 tasks/serve-lib.js diff --git a/package.json b/package.json index 1a5019c0fb..65e665e3bd 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "install": "node tasks/install.js", "postinstall": "closure-util update", "start": "node tasks/serve.js", - "test": "node tasks/test.js" + "test": "node tasks/test.js", + "debug-server": "node tasks/serve-lib.js" }, "main": "dist/ol.js", "repository": { diff --git a/tasks/.jshintrc b/tasks/.jshintrc index 501497c0b4..3c2c4aa041 100644 --- a/tasks/.jshintrc +++ b/tasks/.jshintrc @@ -12,6 +12,7 @@ "globals": { "Buffer": false, "__dirname": false, + "__filename": false, "exports": true, "module": false, "process": false, diff --git a/tasks/serve-lib.js b/tasks/serve-lib.js new file mode 100644 index 0000000000..88329285f6 --- /dev/null +++ b/tasks/serve-lib.js @@ -0,0 +1,83 @@ +/** + * This task starts a dev server that provides a script loader for the + * OpenLayers library. + */ + +var path = require('path'); +var url = require('url'); + +var closure = require('closure-util'); +var nomnom = require('nomnom'); + +var log = closure.log; +var name = path.basename(__filename, '.js'); + +/** + * Create a debug server for the OpenLayers and Closure Library sources. + * @param {function(Error, closure.Server)} callback Callback. + */ +var createServer = exports.createServer = function(callback) { + var server; + var manager = new closure.Manager({ + lib: [ + 'src/**/*.js', + 'build/ol.ext/*.js', + ] + }); + manager.on('error', function(err) { + if (server) { + log.error('serve', err.message); + } else { + callback(err); + } + }); + manager.on('ready', function() { + server = new closure.Server({ + manager: manager, + loader: '/loader.js' + }); + callback(null, server); + }); +}; + +/** + * If running this module directly start the server. + */ +if (require.main === module) { + var options = nomnom.options({ + port: { + abbr: 'p', + default: 3001, + help: 'Port for incoming connections', + metavar: 'PORT' + }, + loglevel: { + abbr: 'l', + choices: ['silly', 'verbose', 'info', 'warn', 'error'], + default: 'info', + help: 'Log level', + metavar: 'LEVEL' + } + }).parse(); + + /** @type {string} */ + log.level = options.loglevel; + + log.info(name, 'Parsing dependencies.'); + createServer(function(err, server) { + if (err) { + log.error(name, 'Parsing failed'); + log.error(name, err.message); + process.exit(1); + } + server.listen(options.port, function() { + log.info(name, 'Debug server running http://localhost:' + + options.port + '/loader.js (Ctrl+C to stop)'); + }); + server.on('error', function(err) { + log.error(name, 'Server failed to start: ' + err.message); + process.exit(1); + }); + }); + +} From 7780d77adee1e8b40d3271ca10d696d216687108 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Wed, 8 Jul 2015 09:16:31 -0600 Subject: [PATCH 2/3] Update to closure-util@1.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 65e665e3bd..cf4de3382e 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "async": "0.9.0", - "closure-util": "1.4.0", + "closure-util": "1.5.0", "fs-extra": "0.12.0", "glob": "5.0.3", "graceful-fs": "3.0.2", From 4549d2f7a8afaadeff04f5ba43e56c4ec76a5282 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Thu, 9 Jul 2015 10:49:24 -0600 Subject: [PATCH 3/3] Try multiple ports --- tasks/serve-lib.js | 46 ++++++++++++++++++++++++++++++++++++++-------- tasks/test.js | 5 ++++- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/tasks/serve-lib.js b/tasks/serve-lib.js index 88329285f6..8e7d76627b 100644 --- a/tasks/serve-lib.js +++ b/tasks/serve-lib.js @@ -40,6 +40,36 @@ var createServer = exports.createServer = function(callback) { }); }; +/** + * Try listening for incoming connections on a range of ports. + * @param {number} min Minimum port to try. + * @param {number} max Maximum port to try. + * @param {http.Server} server The server. + * @param {function(Error)} callback Callback called with any error. + */ +function listen(min, max, server, callback) { + function _listen(port) { + server.once('error', function(err) { + if (err.code === 'EADDRINUSE') { + log.warn(name, 'Port %d in use, trying next one', port); + ++port; + if (port < max) { + _listen(port); + } else { + callback(new Error('Could not find an open port')); + } + } else { + callback(err); + } + }); + server.listen(port); + } + server.once('listening', function() { + callback(null); + }); + _listen(min); +} + /** * If running this module directly start the server. */ @@ -47,8 +77,8 @@ if (require.main === module) { var options = nomnom.options({ port: { abbr: 'p', - default: 3001, - help: 'Port for incoming connections', + default: 3000, + help: 'Port for incoming connections (will try additional ports if used)', metavar: 'PORT' }, loglevel: { @@ -70,13 +100,13 @@ if (require.main === module) { log.error(name, err.message); process.exit(1); } - server.listen(options.port, function() { + listen(options.port, options.port + 4, server, function(err) { + if (err) { + log.error(name, 'Server failed to start: ' + err.message); + process.exit(1); + } log.info(name, 'Debug server running http://localhost:' + - options.port + '/loader.js (Ctrl+C to stop)'); - }); - server.on('error', function(err) { - log.error(name, 'Server failed to start: ' + err.message); - process.exit(1); + server.address().port + '/loader.js (Ctrl+C to stop)'); }); }); diff --git a/tasks/test.js b/tasks/test.js index e644dea235..aecda4c744 100644 --- a/tasks/test.js +++ b/tasks/test.js @@ -31,8 +31,11 @@ function listen(min, max, server, callback) { callback(err); } }); - server.listen(port, '127.0.0.1', callback); + server.listen(port, '127.0.0.1'); } + server.once('listening', function() { + callback(null); + }); _listen(min); }