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