async.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. "use strict";
  2. var _ = require("./lodash.custom");
  3. var Immutable = require("immutable");
  4. var utils = require("./utils");
  5. var pluginUtils = require("./plugins");
  6. var connectUtils = require("./connect-utils");
  7. module.exports = {
  8. /**
  9. * BrowserSync needs at least 1 free port.
  10. * It will check the one provided in config
  11. * and keep incrementing until an available one is found.
  12. * @param {BrowserSync} bs
  13. * @param {Function} done
  14. */
  15. getEmptyPort: function (bs, done) {
  16. utils.getPorts(bs.options, function (err, port) {
  17. if (err) {
  18. return utils.fail(true, err, bs.cb);
  19. }
  20. bs.debug("Found a free port: {magenta:%s", port);
  21. done(null, {
  22. options: {
  23. port: port
  24. }
  25. });
  26. });
  27. },
  28. /**
  29. * If the running mode is proxy, we'll use a separate port
  30. * for the Browsersync web-socket server. This is to eliminate any issues
  31. * with trying to proxy web sockets through to the users server.
  32. * @param bs
  33. * @param done
  34. */
  35. getExtraPortForProxy: function (bs, done) {
  36. /**
  37. * An extra port is not needed in snippet/server mode
  38. */
  39. if (bs.options.get("mode") !== "proxy") {
  40. return done();
  41. }
  42. /**
  43. * Web socket support is disabled by default
  44. */
  45. if (!bs.options.getIn(["proxy", "ws"])) {
  46. return done();
  47. }
  48. /**
  49. * Use 1 higher than server port by default...
  50. */
  51. var socketPort = bs.options.get("port") + 1;
  52. /**
  53. * Or use the user-defined socket.port option instead
  54. */
  55. if (bs.options.hasIn(["socket", "port"])) {
  56. socketPort = bs.options.getIn(["socket", "port"]);
  57. }
  58. utils.getPort(bs.options.get("listen", "localhost"), socketPort, null, function (err, port) {
  59. if (err) {
  60. return utils.fail(true, err, bs.cb);
  61. }
  62. done(null, {
  63. optionsIn: [
  64. {
  65. path: ["socket", "port"],
  66. value: port
  67. }
  68. ]
  69. });
  70. });
  71. },
  72. /**
  73. * Some features require an internet connection.
  74. * If the user did not provide either `true` or `false`
  75. * for the online option, we will attempt to resolve www.google.com
  76. * as a way of determining network connectivity
  77. * @param {BrowserSync} bs
  78. * @param {Function} done
  79. */
  80. getOnlineStatus: function (bs, done) {
  81. if (_.isUndefined(bs.options.get("online")) &&
  82. _.isUndefined(process.env.TESTING)) {
  83. require("dns").resolve("www.google.com", function (err) {
  84. var online = false;
  85. if (err) {
  86. bs.debug("Could not resolve www.google.com, setting {magenta:online: false}");
  87. }
  88. else {
  89. bs.debug("Resolved www.google.com, setting {magenta:online: true}");
  90. online = true;
  91. }
  92. done(null, {
  93. options: {
  94. online: online
  95. }
  96. });
  97. });
  98. }
  99. else {
  100. done();
  101. }
  102. },
  103. /**
  104. * Try to load plugins that were given in options
  105. * @param {BrowserSync} bs
  106. * @param {Function} done
  107. */
  108. resolveInlineUserPlugins: function (bs, done) {
  109. var plugins = bs.options
  110. .get("plugins")
  111. .map(pluginUtils.resolvePlugin)
  112. .map(pluginUtils.requirePlugin);
  113. plugins.forEach(function (plugin) {
  114. if (plugin.get("errors").size) {
  115. return logPluginError(plugin);
  116. }
  117. var jsPlugin = plugin.toJS();
  118. jsPlugin.options = jsPlugin.options || {};
  119. jsPlugin.options.moduleName = jsPlugin.moduleName;
  120. bs.registerPlugin(jsPlugin.module, jsPlugin.options);
  121. });
  122. function logPluginError(plugin) {
  123. utils.fail(true, plugin.getIn(["errors", 0]), bs.cb);
  124. }
  125. done();
  126. },
  127. /**
  128. *
  129. * @param {BrowserSync} bs
  130. * @param {Function} done
  131. */
  132. setOptions: function (bs, done) {
  133. done(null, {
  134. options: {
  135. urls: utils.getUrlOptions(bs.options),
  136. snippet: connectUtils.scriptTags(bs.options),
  137. scriptPaths: Immutable.fromJS(connectUtils.clientScript(bs.options, true)),
  138. files: bs.pluginManager.hook("files:watch", bs.options.get("files"), bs.pluginManager.pluginOptions)
  139. }
  140. });
  141. },
  142. /**
  143. * @param {BrowserSync} bs
  144. * @param {Function} done
  145. */
  146. setInternalEvents: function (bs, done) {
  147. require("./internal-events")(bs);
  148. done();
  149. },
  150. /**
  151. * @param {BrowserSync} bs
  152. * @param {Function} done
  153. */
  154. setFileWatchers: function (bs, done) {
  155. done(null, {
  156. instance: {
  157. watchers: bs.pluginManager.get("file:watcher")(bs)
  158. }
  159. });
  160. },
  161. /**
  162. * @param {BrowserSync} bs
  163. * @param {Function} done
  164. */
  165. mergeMiddlewares: function (bs, done) {
  166. done(null, {
  167. options: {
  168. middleware: bs.pluginManager.hook("server:middleware", bs.options.get("middleware"))
  169. }
  170. });
  171. },
  172. /**
  173. * @param {BrowserSync} bs
  174. * @param {Function} done
  175. */
  176. startServer: function (bs, done) {
  177. var server = bs.pluginManager.get("server")(bs);
  178. done(null, {
  179. instance: {
  180. server: server.server,
  181. app: server.app
  182. }
  183. });
  184. },
  185. /**
  186. * @param {BrowserSync} bs
  187. * @param {Function} done
  188. */
  189. startTunnel: function (bs, done) {
  190. if (bs.options.get("tunnel") && bs.options.get("online")) {
  191. var localTunnel = require("./tunnel");
  192. localTunnel(bs, function (err, tunnel) {
  193. if (err) {
  194. return done(err);
  195. }
  196. else {
  197. return done(null, {
  198. optionsIn: [
  199. {
  200. path: ["urls", "tunnel"],
  201. value: tunnel.url
  202. }
  203. ],
  204. instance: {
  205. tunnel: tunnel
  206. }
  207. });
  208. }
  209. });
  210. }
  211. else {
  212. done();
  213. }
  214. },
  215. /**
  216. * @param {BrowserSync} bs
  217. * @param {Function} done
  218. */
  219. startSockets: function (bs, done) {
  220. var clientEvents = bs.pluginManager.hook("client:events", bs.options.get("clientEvents").toJS());
  221. // Start the socket, needs an existing server.
  222. var io = bs.pluginManager.get("socket")(bs.server, clientEvents, bs);
  223. done(null, {
  224. instance: {
  225. io: io
  226. },
  227. options: {
  228. clientEvents: Immutable.fromJS(clientEvents)
  229. }
  230. });
  231. },
  232. /**
  233. *
  234. * @param {BrowserSync} bs
  235. * @param {Function} done
  236. */
  237. startUi: function (bs, done) {
  238. var PLUGIN_NAME = "UI";
  239. var userPlugins = bs.getUserPlugins();
  240. var ui = bs.pluginManager.get(PLUGIN_NAME);
  241. var uiOpts = bs.options.get("ui");
  242. if (!uiOpts || uiOpts.get("enabled") === false) {
  243. return done();
  244. }
  245. // if user provided a UI, use it instead
  246. if (userPlugins.some(function (item) {
  247. return item.name === PLUGIN_NAME;
  248. })) {
  249. uiOpts = bs.options
  250. .get("ui")
  251. .mergeDeep(Immutable.fromJS(bs.pluginManager.pluginOptions[PLUGIN_NAME]));
  252. }
  253. /**
  254. * Append the 'listen' option
  255. */
  256. var opts = uiOpts.update(function (uiOpts) {
  257. var listen = bs.options.get('listen');
  258. if (listen) {
  259. return uiOpts.set("listen", listen);
  260. }
  261. return uiOpts;
  262. });
  263. return ui(opts.toJS(), bs, function (err, ui) {
  264. if (err) {
  265. return done(err);
  266. }
  267. done(null, {
  268. instance: {
  269. ui: ui
  270. }
  271. });
  272. });
  273. },
  274. /**
  275. * @param {BrowserSync} bs
  276. * @param {Function} done
  277. */
  278. mergeUiSettings: function (bs, done) {
  279. if (!bs.ui) {
  280. return done();
  281. }
  282. done(null, {
  283. options: {
  284. urls: bs.options.get("urls").merge(bs.ui.options.get("urls"))
  285. }
  286. });
  287. },
  288. /**
  289. * @param {BrowserSync} bs
  290. * @param {Function} done
  291. */
  292. initUserPlugins: function (bs, done) {
  293. bs.pluginManager.initUserPlugins(bs);
  294. done(null, {
  295. options: {
  296. userPlugins: bs.getUserPlugins()
  297. }
  298. });
  299. }
  300. };
  301. //# sourceMappingURL=async.js.map