Skip to content

Commit a522aaf

Browse files
authored
Merge pull request #1225 from BrowserSync/rewrites
fix run-time middleware assignment - fixes #1223
2 parents 7a8222d + 1d0ce37 commit a522aaf

19 files changed

+341
-261
lines changed

crossbow.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
tasks:
2+
unit:
3+
- '@npm mocha test/specs/api/** --recursive'
4+
- '@npm mocha test/specs/cli/** --recursive'
5+
- '@npm mocha test/specs/commands/** --recursive'
6+
- '@npm mocha test/specs/e2e/** --recursive'
7+
- '@npm mocha test/specs/files/** --recursive'
8+
- '@npm mocha test/specs/hooks/** --recursive'
9+
- '@npm mocha test/specs/http-protocol/** --recursive'
10+
- '@npm mocha test/specs/instances/** --recursive'
11+
- '@npm mocha test/specs/logger/** --recursive'
12+
- '@npm mocha test/specs/options/** --recursive'
13+
- '@npm mocha test/specs/plugins/** --recursive'
14+
- '@npm mocha test/specs/resp-mod/** --recursive'
15+
- '@npm mocha test/specs/server/** --recursive'
16+
- '@npm mocha test/specs/utils/** --recursive'

lib/async-tasks.js

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,6 @@ module.exports = [
3333
step: "Merging middlewares from core + plugins",
3434
fn: async.mergeMiddlewares
3535
},
36-
{
37-
step: "Setting the rewrite rules given in initial options",
38-
fn: async.setUserRewriteRules
39-
},
40-
{
41-
step: "Setting the rewrite rules middleware for snippet",
42-
fn: async.setRewriteRules
43-
},
4436
{
4537
step: "Starting the Server",
4638
fn: async.startServer
@@ -53,10 +45,6 @@ module.exports = [
5345
step: "Starting the web-socket server",
5446
fn: async.startSockets
5547
},
56-
{
57-
step: "Adding the HTTP protocol",
58-
fn: async.addHttpProtocol
59-
},
6048
{
6149
step: "Starting the UI",
6250
fn: async.startUi

lib/async.js

Lines changed: 1 addition & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -186,61 +186,16 @@ module.exports = {
186186
}
187187
});
188188
},
189-
/**
190-
* If any rewrite rules were given in the options
191-
* save them in their raw state as they will
192-
* be live updated inside resp-modifier/foxy
193-
* @param bs
194-
* @param done
195-
*/
196-
setUserRewriteRules: function (bs, done) {
197-
var userRules = bs.options.get("rewriteRules");
198-
done(null, {
199-
instance: {
200-
rewriteRules: userRules ? userRules.toJS() : []
201-
}
202-
});
203-
},
204-
/**
205-
* Set the built-in rewrite rules
206-
* @param bs
207-
* @param done
208-
*/
209-
setRewriteRules: function (bs, done) {
210-
var snippetUtils = require("./snippet").utils;
211-
done(null, {
212-
instance: {
213-
snippetMw: snippetUtils.getSnippetMiddleware(
214-
bs.options.get("snippet"),
215-
bs.options.get("snippetOptions"),
216-
bs.rewriteRules
217-
)
218-
}
219-
});
220-
},
221189
/**
222190
* @param {BrowserSync} bs
223191
* @param {Function} done
224192
*/
225193
startServer: function (bs, done) {
226194

227-
var clientJs = bs.pluginManager.hook("client:js", {
228-
port: bs.options.get("port"),
229-
options: bs.options
230-
});
231-
232-
var server = bs.pluginManager.get("server")(
233-
bs,
234-
bs.pluginManager.get("client:script")(
235-
bs.options.toJS(),
236-
clientJs,
237-
"middleware"
238-
)
239-
);
195+
var server = bs.pluginManager.get("server")(bs);
240196

241197
done(null, {
242198
instance: {
243-
clientJs: clientJs,
244199
server: server.server,
245200
app: server.app
246201
}
@@ -301,27 +256,6 @@ module.exports = {
301256
}
302257
});
303258
},
304-
/**
305-
* @param bs
306-
* @param done
307-
*/
308-
addHttpProtocol: function (bs, done) {
309-
310-
/**
311-
* Add a middleware to listen to http
312-
* requests in the BrowserSync http protocol namespace
313-
*/
314-
bs.addMiddleware(
315-
require("./config").httpProtocol.path,
316-
require("./http-protocol").middleware(bs),
317-
{
318-
override: true,
319-
id: "Browsersync HTTP Protocol"
320-
}
321-
);
322-
323-
done();
324-
},
325259
/**
326260
*
327261
* @param {BrowserSync} bs

lib/browser-sync.js

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,14 @@ BrowserSync.prototype.addMiddleware = function (route, handle, opts) {
420420
};
421421

422422
if (opts.override) {
423-
return bs.app.stack.unshift(entry);
423+
entry.override = true;
424424
}
425425

426-
bs._addMiddlewareToStack(entry);
426+
bs.options = bs.options.update("middleware", function (mw) {
427+
return mw.concat(entry);
428+
});
429+
430+
bs.resetMiddlewareStack();
427431
};
428432

429433
/**
@@ -439,15 +443,13 @@ BrowserSync.prototype.removeMiddleware = function (id) {
439443
return;
440444
}
441445

442-
bs.app.stack = bs.app.stack.filter(function (item) {
443-
if (!item.id) {
444-
return true;
445-
}
446-
447-
return item.id !== id;
446+
bs.options = bs.options.update("middleware", function (mw) {
447+
return mw.filter(function (mw) {
448+
return mw.id !== id;
449+
});
448450
});
449451

450-
return bs.app;
452+
bs.resetMiddlewareStack();
451453
};
452454

453455
/**
@@ -586,41 +588,46 @@ BrowserSync.prototype.setMany = function (fn, opts) {
586588
return this.options;
587589
};
588590

589-
/**
590-
* Remove a rewrite rule by id
591-
*/
592-
BrowserSync.prototype.removeRewriteRule = function (id) {
591+
BrowserSync.prototype.addRewriteRule = function (rule) {
593592
var bs = this;
594593

595-
bs.setRewriteRules(bs.rewriteRules.filter(fn));
594+
bs.options = bs.options.update("rewriteRules", function (rules) {
595+
return rules.concat(rule);
596+
});
596597

597-
function fn (item) {
598-
if (item.id) {
599-
return item.id !== id;
600-
}
601-
return true;
602-
}
598+
bs.resetMiddlewareStack();
603599
};
604600

605-
/**
606-
* Add a new rewrite rule to the stack
607-
* @param {Object} rule
608-
*/
609-
BrowserSync.prototype.addRewriteRule = function (rule) {
601+
BrowserSync.prototype.removeRewriteRule = function (id) {
602+
var bs = this;
603+
bs.options = bs.options.update("rewriteRules", function (rules) {
604+
return rules.filter(function (rule) {
605+
return rule.id !== id;
606+
});
607+
});
608+
609+
bs.resetMiddlewareStack();
610+
};
611+
612+
BrowserSync.prototype.setRewriteRules = function (rules) {
610613
var bs = this;
614+
bs.options = bs.options.update("rewriteRules", function (_) {
615+
return rules;
616+
});
611617

612-
bs.setRewriteRules(bs.rewriteRules.concat(rule));
618+
bs.resetMiddlewareStack();
613619
};
614620

615621
/**
616-
* Completely replace all rules
617-
* @param {Array} rules
622+
* Add a new rewrite rule to the stack
623+
* @param {Object} rule
618624
*/
619-
BrowserSync.prototype.setRewriteRules = function (rules) {
625+
BrowserSync.prototype.resetMiddlewareStack = function () {
626+
620627
var bs = this;
628+
var middlewares = require("./server/utils").getMiddlewares(bs, bs.options);
621629

622-
bs.rewriteRules = rules;
623-
bs.snippetMw.opts.rules = rules;
630+
bs.app.stack = middlewares;
624631
};
625632

626633
/**

lib/default-config.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,10 @@ module.exports = {
216216
* Add additional HTML rewriting rules.
217217
* @property rewriteRules
218218
* @since 2.4.0
219-
* @type Array|Boolean
219+
* @type Array
220220
* @default false
221221
*/
222-
rewriteRules: false,
222+
rewriteRules: [],
223223

224224
/**
225225
* @property tunnel

lib/file-watcher.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
var _ = require("../lodash.custom");
44
var utils = require("./utils");
5-
var Rx = require("rx/dist/rx.all.js");
5+
var Rx = require("rx");
66

77
/**
88
* Plugin interface

lib/server/index.js

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,13 @@ var _ = require("../../lodash.custom");
77
* Browsersync server
88
* Three available modes: Snippet, Server or Proxy
99
*/
10-
module.exports.plugin = function (bs, scripts) {
10+
module.exports.plugin = function (bs) {
1111

1212
var debug = bs.debug;
1313
var proxy = bs.options.get("proxy");
1414
var type = bs.options.get("mode");
1515

16-
var bsServer = createServer(bs, scripts);
16+
var bsServer = createServer(bs);
1717

1818
if (type === "server" || type === "snippet") {
1919
debug("Static Server running ({magenta:%s}) ...", bs.options.get("scheme"));
@@ -72,24 +72,23 @@ module.exports.plugin = function (bs, scripts) {
7272
/**
7373
* Launch the server for serving the client JS plus static files
7474
* @param {BrowserSync} bs
75-
* @param {String} clientScripts
7675
* @returns {{staticServer: (http.Server), proxyServer: (http.Server)}}
7776
*/
78-
function createServer (bs, clientScripts) {
77+
function createServer (bs) {
7978

8079
var proxy = bs.options.get("proxy");
8180
var server = bs.options.get("server");
8281

8382
if (!proxy && !server) {
84-
return require("./snippet-server")(bs, clientScripts);
83+
return require("./snippet-server")(bs);
8584
}
8685

8786
if (proxy) {
88-
return require("./proxy-server")(bs, clientScripts);
87+
return require("./proxy-server")(bs);
8988
}
9089

9190
if (server) {
92-
return require("./static-server")(bs, clientScripts);
91+
return require("./static-server")(bs);
9392
}
9493
}
9594

lib/server/proxy-server.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,32 +64,27 @@ var ProxyOption = Immutable.Record({
6464
* @param {String} scripts
6565
* @returns {*}
6666
*/
67-
module.exports = function createProxyServer (bs, scripts) {
67+
module.exports = function createProxyServer (bs) {
6868

6969
var opt = new ProxyOption().mergeDeep(bs.options.get("proxy"));
7070
var proxy = httpProxy.createProxyServer(opt.get("proxyOptions").set("target", opt.get("target")).toJS());
7171
var target = opt.get("target");
7272
var proxyReq = getProxyReqFunctions(opt.get("proxyReq"), opt, bs);
7373
var proxyRes = getProxyResFunctions(opt.get("proxyRes"), opt);
7474
var proxyResWs = opt.get("proxyReqWs");
75-
76-
/**
77-
* Add the proxy middleware to any given by the user
78-
*/
79-
var middlewareAdded = bs.options
80-
.update("middleware", function (mw) {
81-
return mw.concat({
82-
id: "Browsersync Proxy",
83-
route: opt.get("route"),
84-
handle: function (req, res) {
85-
proxy.web(req, res, {
86-
target: target
87-
});
88-
}
89-
})
75+
bs.options = bs.options.update("middleware", function (mw) {
76+
return mw.concat({
77+
id: "Browsersync Proxy",
78+
route: opt.get("route"),
79+
handle: function (req, res) {
80+
proxy.web(req, res, {
81+
target: target
82+
});
83+
}
9084
});
85+
});
9186

92-
var app = utils.getBaseApp(bs, middlewareAdded, scripts);
87+
var app = utils.getBaseApp(bs);
9388

9489
/**
9590
* @type {*|{server, app}}

lib/server/static-server.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ var serveIndex = require("serve-index");
1212
* @param scripts
1313
* @returns {*}
1414
*/
15-
module.exports = function createServer (bs, scripts) {
15+
module.exports = function createServer (bs) {
1616

1717
var options = bs.options;
1818
var server = options.get("server");
@@ -21,7 +21,7 @@ module.exports = function createServer (bs, scripts) {
2121

2222
var _serveStatic = 0;
2323
var _routes = 0;
24-
var middlewareAdded = bs.options
24+
bs.options = bs.options
2525
/**
2626
* Add directory Middleware if given in server.directory
2727
*/
@@ -70,7 +70,7 @@ module.exports = function createServer (bs, scripts) {
7070
}));
7171
});
7272

73-
var app = serverUtils.getBaseApp(bs, middlewareAdded, scripts);
73+
var app = serverUtils.getBaseApp(bs);
7474

7575
/**
7676
* Finally, return the server + App

0 commit comments

Comments
 (0)