You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
5.8 KiB
209 lines
5.8 KiB
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(); |
|
} |
|
};
|
|
|