Skip to content

Commit

Permalink
LiveReload closes correctly
Browse files Browse the repository at this point in the history
* added startedCallback paramaeter to server method
* added close method to ConnectApp that closes both connect and lr_tiny (fixes #226)
* added state and additional logs to determine the state of the server at any particular point
* fixed tests as they were failling for various reasons
* added test for ensuring livereload has closed down.
  • Loading branch information
BEllis committed Aug 10, 2017
1 parent 2027a3c commit c915594
Show file tree
Hide file tree
Showing 2 changed files with 159 additions and 72 deletions.
33 changes: 29 additions & 4 deletions src/index.coffee
Expand Up @@ -15,7 +15,7 @@ try
http2 = require('http2')

class ConnectApp
constructor: (options) ->
constructor: (options, startedCallback) ->
@name = options.name || "Server"
@port = options.port || "8080"
@root = options.root || path.dirname(module.parent.id)
Expand All @@ -25,16 +25,23 @@ class ConnectApp
@https = options.https || false
@livereload = options.livereload || false
@middleware = options.middleware || undefined
@startedCallback = startedCallback || () -> {};
@serverInit = options.serverInit || undefined
@fallback = options.fallback || undefined
@index = options.index
@oldMethod("open") if options.open
@sockets = []
@app = undefined
@lr = undefined
@state = "initializing"
@run()

run: ->
if @state == "stopped"
return

@state = "starting"
@log "Starting server..."
@app = connect()

@handlers().forEach (middleware) =>
Expand Down Expand Up @@ -98,6 +105,8 @@ class ConnectApp
socket.destroy()

@server.close()
if @livereload
@lr.close()
process.nextTick( ->
process.exit(0)
)
Expand All @@ -116,6 +125,22 @@ class ConnectApp

@lr.listen @livereload.port
@log "LiveReload started on port #{@livereload.port}"
@state = "running";
@log "Running server"
@startedCallback()

close: ->
if @state == "running"
@log "Stopping server"
if @livereload
@lr.close()
@server.close()
@state = "stopped"
@log "Stopped server"
else if @state == "stopped"
@log "Server has already been stopped."
else
@log "Ignoring stop as server is in " + @state + " state."

handlers: ->
steps = if @middleware then @middleware.call(this, connect, @) else []
Expand Down Expand Up @@ -158,8 +183,8 @@ class ConnectApp
when "open" then @logWarning("Option open #{text}")

module.exports =
server: (options = {}) ->
app = new ConnectApp(options)
server: (options = {}, startedCallback = null) ->
app = new ConnectApp(options, startedCallback)
apps.push(app)
app
reload: ->
Expand All @@ -170,5 +195,5 @@ module.exports =
files: file.path
callback null, file
serverClose: ->
apps.forEach((app) -> do app.server.close)
apps.forEach((app) -> do app.close)
apps = []
198 changes: 130 additions & 68 deletions test/test.js
Expand Up @@ -2,39 +2,55 @@ var request = require('supertest');
var connect = require('../index');
require('mocha');


var portCounter = 35000;
describe('gulp-connect', function () {
describe('Simple', function() {
var req;
before(function() {
connect.server();
req = request('http://localhost:8080');
})
var port;
after(function() {
connect.serverClose();
})
it('Explicit /test.txt', function (done) {
req.get('/fixtures/simplest/test.txt')
.expect(/Hello world/)
.expect(200)
.end(function (err, res) {
done(err);
});
var port = portCounter++;
connect.server({
port: port
}, function() {
request('http://localhost:' + port)
.get('/fixtures/simplest/test.txt')
.expect(/Hello world/)
.expect(200)
.end(function (err, res) {
done(err);
});
});
})
it('Implicit /index.html', function (done) {
req.get('/fixtures/simplest/')
.expect(/index page/)
.expect(200)
.end(function (err, res) {
done(err);
});
var port = portCounter++;
connect.server({
port: port
}, function() {
request('http://localhost:' + port)
.get('/fixtures/simplest/')
.expect(/index page/)
.expect(200)
.end(function (err, res) {
done(err);
});
});
})
})
})
describe('Self Start / Stop', function() {
after(function() {
connect.serverClose();
})
it('Root string', function (done) {
var port = portCounter++;
connect.server({
port: port,
root: __dirname + "/fixtures"
});
request('http://localhost:8080')
request('http://localhost:' + port)
.get('/multiple/app/index.html')
.expect(/app test/)
.end(function (err, res) {
Expand All @@ -44,17 +60,19 @@ describe('gulp-connect', function () {
});
})
it('Root array', function (done) {
var port = portCounter++;
connect.server({
port: port,
root: [__dirname + "/fixtures/multiple/app", __dirname + "/fixtures/multiple/dist"]
});
request('http://localhost:8080')
request('http://localhost:' + port)
.get('/index.html')
.expect(/app test/)
.expect(200)
.end(function (err) {
if (err) return done(err);
});
request('http://localhost:8080')
request('http://localhost:' + port)
.get('/dist.html')
.expect(/dist test/)
.expect(200)
Expand All @@ -81,11 +99,13 @@ describe('gulp-connect', function () {
it('Https test', function (done) {
//suppress invalid self-signed ssl certificate error
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"
var port = portCounter++;
connect.server({
port: port,
root: __dirname + "/fixtures/multiple/app",
https: true
});
request('https://localhost:8080')
request('https://localhost:' + port)
.get('/index.html')
.expect(/app test/)
.end(function (err) {
Expand All @@ -95,72 +115,114 @@ describe('gulp-connect', function () {
});
})
it('Livereload test', function (done) {
var port = portCounter++;
connect.server({
port: port,
livereload: true
}, function() {
request('http://localhost:35729')
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
if (err) return done(err);
request('http://localhost:35729')
.get('/livereload.js')
.expect(200)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
});
});
request('http://localhost:35729')
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
if (err) return done(err);
});
request('http://localhost:35729')
.get('/livereload.js')
.expect(200)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
})
it('Livereload https test', function (done) {
var port = portCounter++;
connect.server({
port: port,
livereload: true,
https: true
}, function() {
request('https://localhost:35729')
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
if (err) return done(err);
request('https://localhost:35729')
.get('/livereload.js')
.expect(200)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
});
});
request('http://localhost:35729')
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
if (err) return done(err);
});
request('http://localhost:35729')
.get('/livereload.js')
.expect(200)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
})
it('Livereload port', function (done) {
var port = portCounter++;
var liveReloadPort = portCounter++;
connect.server({
port: port,
livereload: {
port: 35000
port: liveReloadPort
}
},
function() {
request('http://localhost:' + liveReloadPort)
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
});
})
it('livereload closes', function (done) {
this.timeout(10000);
var port = portCounter++;
var liveReloadPort = portCounter++;
connect.server({
port: port,
livereload: {
port: liveReloadPort
}
},
function() {
request('http://localhost:' + liveReloadPort)
.get('/')
.expect('Content-Type', /json/)
.expect(200)
.end(function (err) {
if (err) return done(err);
connect.serverClose();
setTimeout(function() {
request('http://localhost:' + liveReloadPort)
.get('/')
.end(function (err) {
if (err) return done();
done(new Error("Live reload is still running."));
})}, 100);
})
});
request('http://localhost:35000')
.get('/')
.expect('Content-Type', /json/)
.end(function (err) {
connect.serverClose();
if (err) return done(err);
done();
});
})
it('Fallback test', function (done) {
var port = portCounter++;
connect.server({
port: port,
fallback: __dirname + '/fixtures/simplest/index.html'
}, function() {
request('http://localhost:' + port)
.get('/not/existing/path')
.expect(/index page/)
.expect('Content-Type', new RegExp('text/html; charset=UTF-8'))
.expect(200)
.end(function (err, res) {
connect.serverClose();
if (err) return done(err);
done()
});
});
request('http://localhost:8080')
.get('/not/existing/path')
.expect(/index page/)
.expect('Content-Type', new RegExp('text/html; charset=UTF-8'))
.expect(200)
.end(function (err, res) {
connect.serverClose();
if (err) return done(err);
done()
});
})
})

0 comments on commit c915594

Please sign in to comment.