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