UNPKG

1.43 kBJavaScriptView Raw
1'use strict';
2
3var Promise = require('bluebird');
4var injector = require('connect-injector');
5var browserSync;
6
7module.exports = function(app){
8 var self = this;
9
10 return startBroserSync({logSnippet: false}).then(function(bs){
11 var snippet = bs.options.get('snippet');
12 var queue = [];
13 var timer;
14
15 function reload(){
16 browserSync.reload(queue);
17 queue.length = 0;
18 }
19
20 function listener(path){
21 // Stop the timer
22 if (timer) clearTimeout(timer);
23
24 // Add data to queue
25 queue.push(path);
26
27 // Start the timer
28 timer = setTimeout(reload, 100);
29 }
30
31 app.use(injector(function(req, res){
32 var contentType = res.getHeader('content-type');
33 return contentType && (contentType.toLowerCase().indexOf('text/html') >= 0);
34 }, function(content, req, res, callback){
35 var str = content.toString();
36 var pos = str.lastIndexOf('</body>');
37 if (!~pos) return callback(null, content);
38
39 var result = str.substring(0, pos) + snippet + str.substring(pos);
40 callback(null, result);
41 }));
42
43 self.on('server', function(){
44 self.route.on('update', listener);
45 });
46 });
47};
48
49function startBroserSync(options){
50 if (!browserSync) browserSync = require('browser-sync');
51
52 return new Promise(function(resolve, reject){
53 browserSync(options, function(err, bs){
54 if (err) return reject(err);
55 resolve(bs);
56 });
57 });
58}