5 * Copyright (c) 2016 "Cowboy" Ben Alman, contributors
6 * Licensed under the MIT license.
11 var tinylr = require('tiny-lr');
12 var _ = require('lodash');
14 // Holds the servers out of scope in case watch is reloaded
15 var servers = Object.create(null);
17 module.exports = function(grunt) {
19 var defaults = {port: 35729};
21 function LR(options) {
22 if (options === true) {
24 } else if (typeof options === 'number') {
25 options = {port: options};
27 options = _.defaults(options, defaults);
30 var host = (options.host || '*') + ':' + options.port;
33 this.server = servers[host];
35 this.server = tinylr(options);
36 this.server.server.removeAllListeners('error');
37 this.server.server.on('error', function(err) {
38 if (err.code === 'EADDRINUSE') {
39 grunt.fatal('Port ' + options.port + ' is already in use by another process.');
45 this.server.listen(options.port, options.host, function(err) {
47 return grunt.fatal(err);
49 grunt.log.verbose.writeln('Live reload server started on ' + host);
51 servers[host] = this.server;
55 LR.prototype.trigger = function(files) {
56 grunt.log.verbose.writeln('Live reloading ' + grunt.log.wordlist(files) + '...');
57 this.server.changed({body: {files: files}});
60 return function(options) {
61 return new LR(options);