123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- 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();
- }
- };
|