210 lines
5.8 KiB
JavaScript
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();
|
||
|
}
|
||
|
};
|