work.suroh.tk/node_modules/browser-sync-ui/lib/async.js

210 lines
5.8 KiB
JavaScript

var Immutable = require("immutable");
var url = require("url");
module.exports = {
/**
* The UI uses it's own server/port
* @param ui
* @param done
*/
findAFreePort: function (ui, done) {
var port = ui.options.get("port");
var listenHost = ui.options.get("listen", "localhost");
ui.bs.utils.portscanner.findAPortNotInUse(port, port + 100, {
host: listenHost,
timeout: 1000
}, function (err, port) {
if (err) {
return done(err);
}
done(null, {
options: {
port: port
}
});
});
},
/**
* Default hooks do things like creating/joining JS files &
* building angular config
* @param ui
* @param done
*/
initDefaultHooks: function (ui, done) {
var out = ui.pluginManager.hook("page", ui);
done(null, {
instance: {
clientJs: ui.pluginManager.hook("client:js", ui),
templates: ui.pluginManager.hook("templates", ui.getInitialTemplates(), ui),
pagesConfig: out.pagesConfig,
pages: out.pagesObj,
pageMarkup: out.pageMarkup
}
});
},
setBsOptions: function (ui, done) {
done(null, {
options: {
bs: Immutable.Map({
mode: ui.bs.options.get("mode"),
port: ui.bs.options.get("port")
})
}
});
},
/**
* @param ui
* @param done
*/
setUrlOptions: function (ui, done) {
var port = ui.options.get("port");
var bsUrls = ui.bs.getOptionIn(["urls"]).toJS();
var listenHost = ui.bs.options.get("listen", "localhost");
var urls = {
ui: "http://" + listenHost + ":" + port
};
if (bsUrls.external) {
var externalListen = listenHost || url.parse(bsUrls.external).hostname;
urls["ui-external"] = ["http://", externalListen, ":", port].join("");
}
done(null, {
options: {
urls: Immutable.fromJS(urls)
}
});
},
/**
* Simple static file server with some middlewares for custom
* scripts/routes.
* @param ui
* @param done
*/
startServer: function (ui, done) {
var bs = ui.bs;
var port = ui.options.get("port");
var listenHost = ui.options.get("listen");
ui.logger.debug("Using port %s", port);
var server = require("./server")(ui, {
middleware: {
socket: bs.getMiddleware("socket-js"),
connector: bs.getSocketConnector(bs.options.get("port"), {
path: bs.options.getIn(["socket", "path"]),
namespace: ui.config.getIn(["socket", "namespace"])
})
}
});
require('server-destroy')(server.server);
bs.registerCleanupTask(function () {
if (server.server) {
server.server.destroy();
}
if (ui.servers) {
Object.keys(ui.servers).forEach(function (key) {
if (ui.servers[key].server) {
ui.servers[key].server.destroy();
}
});
}
});
done(null, {
instance: {
server: server.server.listen(port, listenHost),
app: server.app
}
});
},
/**
* Allow an API for adding/removing elements to clients
* @param ui
* @param done
*/
addElementEvents: function (ui, done) {
var elems = ui.pluginManager.hook("elements");
var bs = ui.bs;
if (!Object.keys(elems).length) {
return done();
}
ui.setOption("clientFiles", Immutable.fromJS(elems));
done(null, {
instance: {
enableElement: require("./client-elements").enable(ui.clients, ui, bs),
disableElement: require("./client-elements").disable(ui.clients, ui, bs),
addElement: require("./client-elements").addElement
}
});
},
/**
* Run default plugins
* @param ui
* @param done
*/
registerPlugins: function (ui, done) {
Object.keys(ui.defaultPlugins).forEach(function (key) {
ui.pluginManager.get(key)(ui, ui.bs);
});
done();
},
/**
* The most important event is the initial connection where
* the options are received from the socket
* @param ui
* @param done
*/
addOptionsEvent: function (ui, done) {
var bs = ui.bs;
ui.clients.on("connection", function (client) {
client.emit("ui:connection", ui.options.toJS());
ui.options.get("clientFiles").map(function (item) {
if (item.get("active")) {
ui.addElement(client, item.toJS());
}
});
});
ui.socket.on("connection", function (client) {
client.emit("connection", bs.getOptions().toJS());
client.emit("ui:connection", ui.options.toJS());
client.on("ui:get:options", function () {
client.emit("ui:receive:options", {
bs: bs.getOptions().toJS(),
ui: ui.options.toJS()
});
});
// proxy client events
client.on("ui:client:proxy", function (evt) {
ui.clients.emit(evt.event, evt.data);
});
client.on("ui", function (data) {
ui.delegateEvent(data);
});
});
done();
}
};