1 | 'use strict';
|
2 |
|
3 | var Promise = require('bluebird');
|
4 | var injector = require('connect-injector');
|
5 | var browserSync;
|
6 |
|
7 | module.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 |
|
22 | if (timer) clearTimeout(timer);
|
23 |
|
24 |
|
25 | queue.push(path);
|
26 |
|
27 |
|
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 |
|
49 | function 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 | }
|